Преобразовать CSV в объект JSON, полный числовых массивов
Не уверен в этом - любая помощь очень ценится!
В идеале, используя просто онлайн-конвертер, или, если не возможно, пакет узлов, я пытаюсь преобразовать файл CSV следующим образом:
Cat,31.2,31.2
Dog,35,1
Tree,32.4
в это:
"myObj":{
"Cat":[
31.2,
31.2
],
"Dog":[
35,
1
],
"Tree":[
32.4
]
}
Что я пробовал
Пробовал сайты, подобные этому и этому, но не мог понять, как я могу адаптировать их для своих нужд.
Большое спасибо за любые идеи о том, как это сделать!
4 ответа
const fs = require('fs');
const csv = fs.readFileSync(process.argv[2], 'utf8');
const obj = csv.split(/\r?\n/g)
.filter(line => line.trim())
.map(line => line.split(','))
.reduce(
(o, [key, ...values]) => Object.assign(o, { [key]: values.map(Number) }),
{}
);
fs.writeFileSync(process.argv[3], JSON.stringify(obj, null, 3), 'utf8');
После сохранения этого в csv2json.js
или что-то подобное, вы можете использовать его в командной строке следующим образом:
node csv2json input.csv output.json
Для такого рода вводимых входных данных довольно легко преобразовать их в объект вручную, разделив их на новые строки и reduce
входя в объект:
const input = `Cat,31.2,31.2
Dog,35,1
Tree,32.4`;
const obj = input.split('\n').reduce((a, line) => {
const [, heading, rest] = line.match(/^([^,]+),(.*)/);
a[heading] = rest.split(',');
return a;
}, {});
console.log(obj);
Вы можете написать функцию, которая делает то, что вы хотите, это не так сложно:
function csv2json (csv) {
let arr = csv.split('\n'), // Split your CSV into an array of lines
obj = {} // Your object to later fill data into
for (let i = 0; i < arr.length; i++) {
let line = arr[i].split(',') // Split the line into an array
obj[line.shift()] = line // Remove the first item from the array
// and use it as the key in the object,
// assigning the rest of the array to
// that key
}
return obj // Return your object
}
Позже вы можете записать JSON в файл, используя fs.writeFile(...)
или обработайте его дальше в вашем приложении.
const str = `Cat,31.2,31.2
Dog,35,1
Tree,32.4`;
const obj = str.split('\n').reduce((accu, curr) => {
curr = curr.split(',');
let first = curr.shift();
accu[first] = [...curr];
return accu;
}, {});
console.log(obj);