如何使用Node.js writeStream将JSON数组写入文件?

时间:2018-01-25 12:21:12

标签: javascript json node.js fs node-streams

我写了一个小的Node.js脚本来从我正在迭代页面的网站上抓取数据来提取结构化数据。

我为每个页面提取的数据是一个对象数组的形式。

我以为我可以使用fs.createWriteStream()方法创建一个可写流,我可以在每次页面提取后以递增方式写入数据。

显然,你只能在流中写一个字符串或一个缓冲区,所以我做的是这样的:

output.write(JSON.stringify(operations, null, 2));

但是最后,当我关闭流时,JSON格式错误,因为我只是依次将每个页面的每个数组都附加在一起,结果看起来像这样:

[
    { ... },  /* data for page 1 */
    { ... }
][ /* => here is the problem */
    { ... },  /* data for page 2 */
    { ... }
]

我怎样才能将数组实际附加到输出中而不是链接它们?它甚至可以吗?

1 个答案:

答案 0 :(得分:1)

您的选择将是......

  1. 将完整数组保留在内存中,并在处理完所有页面后仅写入最后的json文件。
  2. 单独编写每个对象,并手动处理方括号和逗号。
  3. 像这样......

    //start processing
    output.write('[');
    //loop through your pages, however you're doing that
    while (more_data_to_read()) {
        //create "operation" object
        var operation = get_operation_object();
        output.write(JSON.stringify(operation, null, 2));
        if (!is_last_page()) {
            //write out comma to separate operation objects within array
            output.write(',');
        }
    }
    //all done, close the json array
    output.write(']');
    

    这将创造格式良好的json。

    就个人而言,我会选择#1,因为这似乎是更“正确”的方式。如果你担心数组使用太多内存,那么json可能不是数据文件的最佳选择。它不是特别适合超大型数据集。

    在上面的代码示例中,如果进程中途中断,那么您将拥有一个无效的json文件,因此逐步写入实际上不会使应用程序更容错。