NodeJs 使用 csv-parser 获取和解析 CSV 文件

NodeJs Fetch and parse CSV file using csv-parser

提问人:indigo 提问时间:8/1/2023 更新时间:8/1/2023 访问量:146

问:

我正在尝试使用 AWS S3 获取 csv 文件的内容并使用它进行解析,然后将解析后的数据存储到我的本地数据库。由于存储桶/文件设置为公有,我很确定在执行请求时不需要包含 bucketName、密钥、访问/安全密钥。现在我能够获取csv文件的内容,但未解析。首先是所有标识符,然后是每条记录的所有值,用换行符分隔,如下所示:axioscsv-parser

taskID,status,lastUpdate
1,ongoing,2023-01-01
2,completed,2023-01-02

我尝试使用 csv 解析器,但我不确定我缺少什么,而且我似乎无法显示错误。以下是我到目前为止所做的:

const fs = require("fs")
const csvParser = require("csv-parser")
const axios = require("axios")

async function parseCSVFile(filePath) {
  let parsedData = []

  axios.get(filePath).then(function(response) {
      let csvData = response.data
      console.log(csvData);

      csvParser(csvData, { headers: true })
      .on('data', function(data) {
        console.log('asdasd');
        parsedData.push(data)
      })
      .on('end', function() {
        console.log('CSV data parsed', parsedData);
      })
      .on('error', function() {
        console.log("Error parsing CSV data");
      })
  })
  
}

我最初尝试使用 fs,当然它有效,但只是因为我尝试解析的文件是在本地找到的。my 有一个值,但它是纯文本的,但它没有被推送到csvDataparsedData

node.js csv amazon-s3 csv-parser

评论


答:

0赞 traynor 8/1/2023 #1

csv-parser与 一起使用,它们通过管道传递给它,因此它不会像在代码中那样将字符串作为参数,而只接受 options 对象,这就是它不起作用的原因。streams

因此,将 axios 响应转换为流:

axios.get(filePath, { responseType: 'stream'})

然后将响应流管道传递到 csv-parser:

response.data.pipe(csvParser({ headers: true }))

试试这个:

 axios.get(filePath, { responseType: 'stream'}).then(function(response) {
      let csvData = response.data
      console.log(csvData); // this is a stream now..

      csvData.pipe(csvParser({ headers: true }))
      .on('data', function(data) {
        console.log('asdasd', data);
        parsedData.push(data)
      })
      .on('end', function() {
        console.log('CSV data parsed', parsedData);
      })
      .on('error', function() {
        console.log("Error parsing CSV data");
      })
  })

评论

0赞 indigo 8/7/2023
我最终在 get 方法之后添加了一个 catch,以便在文件/url 路径不存在或无效时返回错误。出于某种原因,调用时添加会返回一个对象,其中包含所有列名的 (1) 数组,然后是 (2) 值数组(每条记录一个数组),所以我将其删除。headers: truecsvParser
0赞 traynor 8/7/2023
伟大。好吧,您可以根据要执行的操作设置选项,请选中选项