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

qgelzfjb  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(340)

我尝试使用axios从AWS S3获取csv文件的内容,并使用csv-parser it解析它,然后将解析后的数据存储到本地数据库。由于bucket/file被设置为public,我很确定在执行请求时不需要包括bucketName、key、access/security key。现在我能够获取csv文件的内容,但它没有被解析。首先是所有标识符,然后是每个记录的所有值,用新行分隔,类似于以下内容:

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,当然它工作,但只是因为我试图解析的文件是在本地找到的。我的csvData有一个值,但它是纯文本的,但它没有被推送到parsedData

klh5stk1

klh5stk11#

csv-parserstreams一起工作,streams通过管道传输给它,因此它不接受字符串作为参数,就像在代码中一样,只有选项对象,这就是它不工作的原因。
因此,将axios响应转换为一个流:

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

字符串
然后将响应流通过管道传输到csv解析器:

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");
      })
  })

相关问题