使用'csvtojson'从Google Cloud Storage中的csv文件获取JSON数据

时间:2019-07-26 01:46:34

标签: javascript node.js google-cloud-functions google-cloud-storage csvtojson

我有一个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);
        });

0 个答案:

没有答案