2016-04-12 5 views
3

Я пытаюсь преобразовать ниже CSV отформатированных данных в массив объектов JSON,NodeJS - Преобразование CSV в массив объектов JSON

CSV formatted data: apples,oranges,grapes,peach,pineapple 

JSON Object Array: { 
        fruits: [ 
         { 
          "name": "apples" 
         }, 
         { 
          "name": "oranges" 
         }, 
         { 
          "name": "grapes" 
         }, 
         { 
          "name": "peach" 
         }, 
         { 
          "name": "pineapple" 
         } 
        ] 
        } 

Я передал этот пакет NPM https://www.npmjs.com/package/csvtojson и этот с потоком парсер https://github.com/nicolashery/example-stream-parser, но не знаю, как это может соответствовать моей потребности.

Может кто-нибудь предложить способ преобразования этих данных CSV в массив объектов JSON в формате, который был опубликован.

Раствор для вышеупомянутого запроса (Пожалуйста, обратитесь комментарии раздел для более подробной информации ниже),

var res = {}; 

res.fruits = 'apples|1,oranges|2,grapes|3,peach|4,pineapple|5' 
.split(',').map(function (fruit) { //as did by @Dmitriy Simushev in the below reply 
    return { 
     "name": fruit.split('|')[0], 
     "value": fruit.split('|')[1] 
    } 
}); 

document.write('<pre>' + JSON.stringify(res, 0, 2) + '</pre>'); 
+1

Формат, который вы показываете, не является csv. В отдельных полях/свойствах и строках запятой запятой представлены записи/объекты. –

ответ

1

Вы можете использовать простой javascript, с split и map функции

var res = {}; 
 

 
res.fruits = 'apples|1,oranges|2,grapes|3,peach|4,pineapple|5' 
 
    .split(',').map(e => ({ 
 
     "name": e.split('|')[0], 
 
     "value": e.split('|')[1] 
 
    })); 
 

 
document.write('<pre>' + JSON.stringify(res, 0, 2) + '</pre>');

+0

, используя простой раскол и работу с картами, действительно хорош, особенно с синтаксисом => ECMA (не совсем уверен, что он называется, это функции Arrow?), Так как я сказал, что это довольно гладкий и чистый. Просто интересно, что, если у меня есть CSV-данные, такие как «яблоки» 1, апельсины | 2, виноград | 3, персик | 4, ананас | 5 », и полученный JSON должен выглядеть примерно так: – Sai

+0

{ фрукты: [ { {name": "Яблоки », "значение": "1" }, { "название": "апельсины", "значение": "2" }, { "название": "виноград", "значение" : "3" } .... ] } – Sai

+0

@Sai см. Обновление – isvforall

1

Вы можете легко комбинировать String.prototype.split с Array.prototype.map для достижения цели.

Вот пример того, как это можно сделать:

var data = "apples,oranges,grapes,peach,pineapple"; 

// Wrap fruits names with object, 
var fruits = data.split(',').map(function(fruit) { 
    return {name: fruit} 
}); 

// Wrap fruits set with outer object. 
var json = {fruits: fruits}; 

// Show the result. 
console.dir(json); 
+0

данные («яблоки, апельсины, виноград, персик, ананас»), я проецировал это всего лишь пример, на самом деле в приложении я получаю примерно 1100 значений с разделенными запятыми ... как вы думаете, что подход на основе разделения и карты работайте даже в этом случае, не влияя на память. – Sai

+0

Собственно, в результате JSON сохранит все ваши данные. Таким образом, вы все равно будете использовать эту память. Кроме того, 1100 значений - относительно небольшой набор данных. –

1

var csv_data = 'apples,oranges,grapes,peach,pineapple'; 
 
var csv_array = csv_data.split(','); 
 
var object = {}; 
 
var arr = []; 
 
for(var i=0; i<csv_array.length; i++){ 
 
    arr.push({name:csv_array[i]}); 
 
} 
 
object['fruits'] = arr; 
 
console.log(object);

0

Как показано в docs, вы можете преобразовать файл CSV, как это

var Converter = require("csvtojson").Converter; 
var converter = new Converter({}); 
converter.fromFile("./yourCSVfile.csv", function(err, result){ 
    // do something with "result", it's json 
}); 
0

Каждый ответ до сих пор не отражает, что данные хранятся в файле. И я думаю, что это то, что вы ищете. Вы можете использовать простые Node.js потоки для достижения этой цели:

var fs = require('fs'); 
var es = require('event-stream'); 

fs.createReadStream('data.csv') 
.pipe(es.split()) 
.on('data', (row) => { 
    console.log({ 
    fruits: row.toString().split(',').map((fruit) => { 
     return { 
     name: fruit.trim() 
     } 
    }) 
    }); 
}); 

Вам необходимо установить событие-поток npm install event-stream.

Смежные вопросы