提问人:indigo 提问时间:8/1/2023 更新时间:8/1/2023 访问量:146
NodeJs 使用 csv-parser 获取和解析 CSV 文件
NodeJs Fetch and parse CSV file using csv-parser
问:
我正在尝试使用 AWS S3 获取 csv 文件的内容并使用它进行解析,然后将解析后的数据存储到我的本地数据库。由于存储桶/文件设置为公有,我很确定在执行请求时不需要包含 bucketName、密钥、访问/安全密钥。现在我能够获取csv文件的内容,但未解析。首先是所有标识符,然后是每条记录的所有值,用换行符分隔,如下所示:axios
csv-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 有一个值,但它是纯文本的,但它没有被推送到csvData
parsedData
答:
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: true
csvParser
0赞
traynor
8/7/2023
伟大。好吧,您可以根据要执行的操作设置选项,请选中选项
评论