Получить полезный массив от csvtojson
Я видел примеры кода использования csvtojson, но каждый просто выводит результат с помощью console.log(). Следующий код создает переменную с именем "json", но я не вижу, как я могу использовать это вне функции, создающей ее. Как я могу экспортировать переменную 'json' для использования вне функции, которая ее создает?:
const csvFilePath='<path to csv file>'
const csv=require('csvtojson')
csv().fromFile(csvFilePath,function(err,result){
if(err){
console.log("An Error Has Occured");
console.log(err);
}
var json = result; // I want to use this var outside of this function.
console.log(json);
});
Я действительно надеялся, что это будет так же просто, как написать что-то вроде:
const dataArray = csv().fromFile(csvFilePath);
Но dataArray не содержит мои данные, а вместо этого представляется объектом с параметрами о данных.
Любые подсказки будут с благодарностью!
2 ответа
Проблема в том, что fromFile
является асинхронным, и как только вы вызвали асинхронный код, вы живете в обратном вызове.
Модуль, кажется, не предоставляет альтернативу синхронизации. Ваши варианты:
- Продолжайте логику вашей программы внутри обратного вызова:
csv().fromFile(csvFilePath,function(err,result){
if(err){
console.log("An Error Has Occured");
console.log(err);
}
var json = result;
console.log(json);
// Continue your logic here
// .....
// .....
});
- Используйте async / await
Вы, кажется, используете более старую версию csvtojson
, так что вам может потребоваться обновить его, чтобы использовать это:
(async () => {
var jsons = await csv().fromFile(csvFilePath);
console.log(jsons);
})()
.catch((err) => {
console.log(err);
});
В основном это оборачивает ваш код внутри async
функция. Внутри вы можете использовать возвращаемое значение fromFile
если вы используете await
ключевое слово.
- Используйте другой модуль, который поддерживает синхронизированную загрузку, или даже выполняйте синтаксический анализ самостоятельно.
Я немного узнал об асинхронных функциях и обещаниях с тех пор, как разместил этот вопрос. Поскольку csvjson возвращает обещания, я возвращаю результат csv() следующей функции в моей цепочке:
const csv = require('csvtojson');
const filePath = '<path to csv file>';
// previous async function in promise chain
.then(() => {
return csv().fromFile(filePath)
})
.then(data => { // 'data' contains the json as converted by csv()
// next step in promise chain
})
Функция csvJSON с функциональной картой
var csvJSON = function(csv){
var lines = csv.split("\n");
var result = [];
var headers = lines[0].split(",");
lines.map(function(line, indexLine){
if (indexLine < 1) return // Jump header line
var obj = {};
var currentline = line.split(",");
headers.map(function(header, indexHeader){
obj[header] = currentline[indexHeader];
})
result.push(obj);
})
result.pop(); // remove the las`enter code here`t item because undefined values
return result; // JavaScript object
}