Получить полезный массив от csvtojson - PullRequest
0 голосов
/ 10 ноября 2018

Я видел примеры кода использования 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 не содержит мои данные, а вместо этого представляется объектом с параметрами о данных.

Любые подсказки будут с благодарностью!

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Проблема в том, что 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.

  • Используйте другой модуль, который поддерживает синхронизированную загрузку, или даже выполняйте синтаксический анализ самостоятельно.
0 голосов
/ 09 декабря 2018

Я немного узнал об асинхронных функциях и обещаниях с тех пор, как опубликовал этот вопрос. Поскольку 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
    })
0 голосов
/ 11 ноября 2018

функция 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
}
...