【问题标题】:csvtojson node.js (combine two codes)csvtojson node.js(结合两个代码)
【发布时间】:2021-11-14 03:11:21
【问题描述】:

如何结合这两个代码,所以它不仅将 csv 转换为 Json(第一个代码),而且还将其保存为一个 json 数组在一个额外的文件中?(第二个代码) 此(第一个)代码将 csv 文件转换为 json 数组:

const fs = require("fs");

let fileReadStream = fs.createReadStream("myCsvFile.csv");
let invalidLineCount = 0;

const csvtojson = require("csvtojson");
csvtojson({ "delimiter": ";", "fork": true })
.preFileLine((fileLineString, lineIdx)=> {
    let invalidLinePattern = /^['"].*[^"'];/;
    if (invalidLinePattern.test(fileLineString)) {
        console.log(`Line #${lineIdx + 1} is invalid, skipping:`, fileLineString);
        fileLineString = "";
        invalidLineCount++;
    }
    return fileLineString
})
.fromStream(fileReadStream) 
.subscribe((dataObj) => { 
    console.log(dataObj);
// I added the second code hier, but it wirtes the last object of the array (because of the loop?)
}    
});

这个(第二个)代码将 json 数组保存到一个外部文件:

fs.writeFile('example.json', JSON.stringify(dataObj, null, 4);

问题是如何将第二个代码放入第一个代码中(组合它们)?

【问题讨论】:

  • 第一个将 CSV 转换为 JSON,但是您的 JSON 输出在哪里?我假设它是dataObj?那么在第一个代码中复制/粘贴第二个代码怎么样?
  • 我在这里复制了第二个代码:.subscribe((dataObj)=>,订阅就像循环一样工作,创建的 json 文件中的数组只是循环数组中的最后一个对象。
  • 嗯,确实,我查看了文档,看起来订阅触发器在每个 CSV 行解析,所以dataObj 只是一个数据块。也许您需要手动将此块添加到对象中?库没有自动输出整个结果真的很奇怪o_O
  • @JeremyThille,有没有伊迪亚?

标签: javascript node.js arrays json


【解决方案1】:

您可以使用.on('done',(error)=>{ ... }) 方法。 (csvtojson)。将数据推送到subscribe 方法中的变量中,并将数据以JSON 格式写入.on('done')。 (测试成功)。

检查一下:

let fileReadStream = fs.createReadStream("username-password.csv");
let invalidLineCount = 0;
let data = []

csvtojson({ "delimiter": ";", "fork": true })
  .preFileLine((fileLineString, lineIdx)=> {
    let invalidLinePattern = /^['"].*[^"'];/;
    if (invalidLinePattern.test(fileLineString)) {
        console.log(`Line #${lineIdx + 1} is invalid, skipping:`, fileLineString);
        fileLineString = "";
        invalidLineCount++;
    }
    return fileLineString
  })
  .fromStream(fileReadStream) 
  .subscribe((dataObj) => {
    // console.log(dataObj)
    data.push(dataObj)
  })
  .on('done',(error)=>{
    fs.writeFileSync('example.json', JSON.stringify(data, null, 4))
  })

【讨论】:

  • 请编辑您的答案,这样可能对其他人有所帮助:)
  • 完成!我要删除所有 cmets
  • 我想在线上传我的项目(nodejs项目),你知道如何通过打开我网站上的特定页面来自动运行这段代码吗?
【解决方案2】:

不确定您是否能够更改库,但我肯定会为此推荐 Papaparse - https://www.npmjs.com/package/papaparse

您的代码将如下所示:

const fs = require('fs'), papa = require('papaparse');
  var readFile = fs.createReadStream(file);
        papa.parse(readFile, {
            complete: function (results, file) {
                fs.writeFile('example.json', JSON.stringifiy(results.data), function (err) {
                  if(err) console.log(err);
                  // callback etc
                })
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    相关资源
    最近更新 更多