我有一个Google Cloud Function,每次将CSV文件上传到Google Cloud Storage上的存储桶时都会触发。
我可以读出文件并将其解析为表示对象数组的JSON字符串(使用csvtojson),除了在数组的最后一项外加尾部逗号:
[
{"id":"a","name":"1"},
{"id":"b","name":"2"},
... ,
{"id":"y","name":"25"},
{"id":"z","name":"26"}, <= trailing comma here :(
]
最后一个逗号导致JSON.parse(json)
引发异常。
我现在正在使用以下代码:
import { Converter } from 'csvtojson/v2/Converter';
const csvConverter = new Converter({ downstreamFormat: "array" });
const storage = new gcs.Storage();
let fileContents = new Buffer('');
storage
.bucket(bucketName)
.file(fileName)
.createReadStream()
.pipe(csvConverter)
.on("error", err => {
reject("The Storage API returned an error: " + err);
})
.on("data", chunk => {
fileContents = Buffer.concat([fileContents, chunk]);
})
.on("end", () => {
const json = fileContents.toString('utf8');
console.log(json); // See output above
const content = JSON.parse(json); // Unexpected token ] in JSON
resolve(content);
});
有什么想法可以为完整的csv文件获取json对象吗?
我的示例csv如下所示:
id,name
a,1
b,2
c,3
d,4
....
x,24
y,25
z,26
更新:以下代码确实可以工作,但我必须找出将其用于大型csv文件是否很好。它使用 subscribe 方法,而不是监听数据事件。
const storage = new gcs.Storage();
const items = [];
storage
.bucket(file.bucket)
.file(file.name)
.createReadStream()
.pipe(csvConverter)
.subscribe(data => {
items.push(data);
})
.on("error", err => {
reject("The Storage API returned an error: " + err);
})
.on("end", () => {
resolve(items);
});