【问题标题】:Convert CSV Array To JSON NodeJS将 CSV 数组转换为 JSON NodeJS
【发布时间】:2019-10-11 06:03:39
【问题描述】:

我正在从包含csv 的URL 中抓取数据。我正在抓取的数据格式是这样的:

我在 Node.js 中执行此操作并使用 nodejs-requestify package:https://www.npmjs.com/package/requestify

当我控制台 response.getBody() 时,它的格式与提供的屏幕截图完全相同。

我正在尝试将其转换为 JSON array,我可以在循环中进行迭代以将值插入数据库,但是,我正在努力将数据转换为 JSON 格式。

我尝试过以多种方式拆分数组 (comma, single quote, double quote)。我已经尝试过JSON.parse() 和JSON.stringify()(以及两者的组合)。

这是我正在使用的代码。最终,当我在循环中 console.log 行时,这应该是 JSON 格式的位置,但是,它仍然以逗号分隔值的形式出现。

requestify.get('URL').then(function(response) {
  // Get the response body
  var dataBody = response.getBody();
  var lineArray = dataBody.split('\r\n');
  var data = JSON.parse(JSON.stringify(lineArray));

  for(var s = 0; s < data.length; s++) {
    var rows = data[s];
    console.log(rows)
  }
});

【问题讨论】:

  • 一般来说,假设在换行符处拆分会给你 CSV 的行是不安全的。对于带引号的字段,可以在字段中出现换行符。我强烈建议使用现有的 CSV 模块,例如 csv-parse 或 csv-parser,它将为您处理边缘情况。
  • 好的,我会研究 csv-parse
  • 所以 lineArray 为您提供了图像中显示的值?还有一件事是你正在做 JSON.stringify JSON.parse 这是不正确的。
  • 我解决了这个问题。作为答案发布。

标签: arrays node.js json csv


【解决方案1】:

我通过使用 csvtojson 和 aws-dsk 解决了这个问题,因为我的 csv 托管在 S3 上。

async function startAWS(db){
  //Retrieve AWS IAM credentials for the 'master' user
  var awsCredentials;
  try{ 
    awsCredentials = await retrievePromise(config.get('aws')); 
  }
  catch (e) { 
    console.log({error:e},'startAWS error'); 
  }
  //Setup the AWS config to access our S3 bucket
  AWS.config = new AWS.Config({
    accessKeyId :  awsCredentials.principal,
    secretAccessKey :awsCredentials.credential,
    region:'us-east-1'
  });
  //Call S3 and specify bucket and file name
  const S3 = new AWS.S3();
  const params = {
    Bucket: '***',
    Key: '***' //filename
  };
  //Convert csv file to JSON
  async function csvToJSON() {
  // get csv file and create stream
  const stream = S3.getObject(params).createReadStream();
  // convert csv file (stream) to JSON format data
  const json = await csv().fromStream(stream);

  //connect to DB and continue script
  db.getConnection()
  .then(async (conn) => {
    if(json.length) {
      for(var s = 0; s < json.length; s++) {
        var rows = json[s];

        const insert = await conn.query(
          'SQL HERE'
        );
      }
    }
  })
  };
  csvToJSON();
}


【讨论】:

    【解决方案2】:

    我认为有一个基本的误解

    var lineArray = dataBody.split('\r\n');
    

    lineArray 现在包含类似

    "a", "b", "c"
    

    但是为了做类似的事情

    var data = JSON.parse(lineArray);
    

    你需要 lineArray 是

    { "a":"1", "b":"2", "c":"3" }
    

    我认为你需要类似的东西

    const lineData = lineArray.split(',');
    const keys = ["name", "age", "gender"];
    const jsonLineData = {};
    keys.forEach((key, index) => {
        jsonLineData[key] = lineData(index);
    });
    

    【讨论】:

    • 为了确认,我在键数组中放置了我的 csv 的标题?
    • 这对我不起作用。也许您可以详细说明这段代码?
    猜你喜欢
    • 2016-08-03
    • 2015-12-20
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多