Подтвердить что ты не робот

Как преобразовать CSV в JSON в Node.js

Я пытаюсь преобразовать файл csv в json. Я использую.

Пример CSV:

a,b,c,d
1,2,3,4
5,6,7,8
...

Желаемый JSON:

{"a": 1,"b": 2,"c": 3,"d": 4},
{"a": 5,"b": 6,"c": 7,"d": 8},
...

Я попробовал библиотеку parser node -csv. Но вывод похож на массив, который я не ожидал.

Я использую Node 0.8 и express.js и хотел бы получить рекомендацию о том, как легко выполнить это.

4b9b3361

Ответ 1

Node.js csvtojson module является всеобъемлющим парсером nodejs csv. Его можно использовать как библиотеку приложений node.js/инструмент командной строки/или браузер с помощью browserify или webpack.

исходный код можно найти по адресу: https://github.com/Keyang/node-csvtojson

Быстро с низким потреблением памяти, но мощным для поддержки любых потребностей синтаксического анализа с обильным API и легко читаемой документацией.

Подробную документацию можно найти здесь

Вот несколько примеров кода:

Используйте его как библиотеку в приложении node.js([email protected] +):

  • Установите его через npm

npm install --save [email protected]

  1. Используйте его в своем приложении node.js:
// require csvtojson
var csv = require("csvtojson");

// Convert a csv file with csvtojson
csv()
  .fromFile(csvFilePath)
  .on("end_parsed",function(jsonArrayObj){ //when parse finished, result will be emitted here.
     console.log(jsonArrayObj); 
   })

// Parse large csv with stream / pipe (low mem consumption)
csv()
  .fromStream(readableStream)
  .on("json",function(jsonObj){ //single json object will be emitted for each csv line
    console.log(jsonObj);
  }) 

//Convert csv string to csv rows
csv()
  .fromString(csvString)
  .on("csv",function(row){ // an array of csv cols like [col1, col2, col3 ...]
    console.log(row);
  })

Используйте его как инструмент командной строки:

sh# npm install -g csvtojson
sh# csvtojson ./yourCsvFile.csv

Для расширенного использования:

sh# csvtojson --help

Более подробную информацию вы найдете на странице github выше.

Ответ 2

Вы можете попытаться использовать underscore.js

Сначала преобразуйте строки в массивы с помощью функции toArray:

var letters = _.toArray(a,b,c,d);
var numbers = _.toArray(1,2,3,4);

Затем объедините массивы вместе с помощью функции object:

var json = _.object(letters, numbers);

К тому времени json var должен содержать что-то вроде:

{"a": 1,"b": 2,"c": 3,"d": 4}

Ответ 3

Вот решение, которое не требует отдельного модуля. Тем не менее, он очень грубый и не обеспечивает значительной обработки ошибок. Он также мог бы использовать больше тестов, но он заставит вас идти. Если вы разбираете очень большие файлы, вы можете захотеть найти альтернативу. Также см. Это решение от Ben Nadel.

Node Код модуля, csv2json.js:

/*
 * Convert a CSV String to JSON
 */
exports.convert = function(csvString) {
    var json = [];
    var csvArray = csvString.split("\n");

    // Remove the column names from csvArray into csvColumns.
    // Also replace single quote with double quote (JSON needs double).
    var csvColumns = JSON
            .parse("[" + csvArray.shift().replace(/'/g, '"') + "]");

    csvArray.forEach(function(csvRowString) {

        var csvRow = csvRowString.split(",");

        // Here we work on a single row.
        // Create an object with all of the csvColumns as keys.
        jsonRow = new Object();
        for ( var colNum = 0; colNum < csvRow.length; colNum++) {
            // Remove beginning and ending quotes since stringify will add them.
            var colData = csvRow[colNum].replace(/^['"]|['"]$/g, "");
            jsonRow[csvColumns[colNum]] = colData;
        }
        json.push(jsonRow);
    });

    return JSON.stringify(json);
};

Тест на жасмин, csv2jsonSpec.js:

var csv2json = require('csv2json.js');

var CSV_STRING = "'col1','col2','col3'\n'1','2','3'\n'4','5','6'";
var JSON_STRING = '[{"col1":"1","col2":"2","col3":"3"},{"col1":"4","col2":"5","col3":"6"}]';

/* jasmine specs for csv2json */
describe('csv2json', function() {

    it('should convert a csv string to a json string.', function() {
        expect(csv2json.convert(CSV_STRING)).toEqual(
                JSON_STRING);
    });
});

Ответ 4

Придется сделать что-то подобное, надеюсь, что это поможет.

// Node packages for file system
var fs = require('fs');
var path = require('path');


var filePath = path.join(__dirname, 'PATH_TO_CSV');
// Read CSV
var f = fs.readFileSync(filePath, {encoding: 'utf-8'}, 
    function(err){console.log(err);});

// Split on row
f = f.split("\n");

// Get first row for column headers
headers = f.shift().split(",");

var json = [];    
f.forEach(function(d){
    // Loop through each row
    tmp = {}
    row = d.split(",")
    for(var i = 0; i < headers.length; i++){
        tmp[headers[i]] = row[i];
    }
    // Add object to list
    json.push(tmp);
});

var outPath = path.join(__dirname, 'PATH_TO_JSON');
// Convert object to string, write json to file
fs.writeFileSync(outPath, JSON.stringify(json), 'utf8', 
    function(err){console.log(err);});

Ответ 6

Я начал с node-csvtojson, но он привел слишком много зависимостей для моей привязки.

Основываясь на вашем вопросе и ответе brnd, я использовал node-csv и underscore.js.

var attribs;
var json:
csv()
    .from.string(csvString)
    .transform(function(row) {
        if (!attribs) {
            attribs = row;
            return null;
        }
        return row;
     })
    .to.array(function(rows) {
        json = _.map(rows, function(row) {
            return _.object(attribs, row);
        });
     });

Ответ 7

Используя lodash:

function csvToJson(csv) {
  const content = csv.split('\n');
  const header = content[0].split(',');
  return _.tail(content).map((row) => {
    return _.zipObject(header, row.split(','));
  });
}

Ответ 8

Я использовал csvtojson библиотеку для преобразования строки csv в json-массив. Он имеет множество функций, которые могут помочь вам конвертировать в JSON.
Он также поддерживает чтение из потоковой передачи файлов и файлов.

Будьте внимательны при анализе csv, который может содержать запятую (,) или любой другой разделитель. Для удаления разделителя см. Мой ответ здесь.

Ответ 9

Я и мой приятель создали веб-сервис для работы с такими вещами.

Ознакомьтесь с Modifly.co для получения инструкций о том, как преобразовать CSV в JSON с помощью одного вызова RESTful.

Ответ 10

Node -ETL достаточно для всей обработки BI.

npm install node-etl; 

Тогда:

var ETL=require('node-etl');
var output=ETL.extract('./data.csv',{
              headers:["a","b","c","d"],
              ignore:(line,index)=>index!==0, //ignore first line
 });

Ответ 11

Используйте библиотеку csv parser, я более подробно объясняю, как его использовать здесь.

var csv = require('csv');
csv.parse(csvText, {columns: true}, function(err, data){
    console.log(JSON.stringify(data, null, 2));
});

Ответ 12

Шаг 1:

Установите модуль node: npm install csvtojson --save

Шаг 2:

var Converter = require("csvtojson").Converter;

var converter = new Converter({});

converter.fromFile("./path-to-your-file.csv",function(err,result){

    if(err){
        console.log("Error");
        console.log(err);  
    } 
    var data = result;

    //to check json
    console.log(data);
});