将逗号分隔的 JSON 转换为换行符分隔的节点

Posted

技术标签:

【中文标题】将逗号分隔的 JSON 转换为换行符分隔的节点【英文标题】:Converting comma delimited JSON to a newline delimited node 【发布时间】:2015-12-21 10:20:07 【问题描述】:

我有一个 JSON 文件,我正在使用 node 读取它,将其修改并保存为 json 文件。

我希望将新的 json 保存为换行符分隔而不是保存在数组中。

我遇到了https://github.com/CrowdProcess/newline-json,但不完全理解流。如果我有以下流设置,如何通过解析器和字符串化器对其进行管道传输?

fileStream = fs.createReadStream('source.json')
writeStream = fs.createWriteStream('output.txt');

var Parser = require('newline-json').Parser;
var Stringifier = require('newline-json').Stringifier;

var parser = new Parser();
var stringifier = new Stringifier();

但运行以下只会输出一个空白文件。

fileStream.pipe(parser).pipe(stringifier).pipe(writeStream)

关于流,我缺少什么?

【问题讨论】:

source.son ← 这是错字吗? 是的,谢谢,已修正错字 【参考方案1】:

对于任何正在寻求解决方案的人将对象的 json 数组转换为 nd-json。这是解决方案:

输入:

const arrObj = [
  id: 1,
  name: 'joe'
, 
  id: 2,
  name: 'ben'
, 
  id: 3,
  name: 'jake'
, 
  id: 4,
  name: 'marsh'
];

// stringify the object and join with \n
const ndJson = arrObj.map(JSON.stringify).join('\n');

console.log(ndJson);

输出:

"id":1,"name":"joe"
"id":2,"name":"ben"
"id":3,"name":"jake"
"id":4,"name":"marsh"

示例用例:将 bulk request 从 json 文件导入 elasticsearch 时。

快乐编码:)

【讨论】:

Elasticsearch Bulk API 是我查找此线程的确切用例,此评论是一个非常好的开始。但是,对于 Bulk API,您还需要记住添加标题并在文件末尾附加换行符。这是一个更完整的示例:` ` ` const header = "index": ; const ndJson = data.flatMap(d => [header, d]).map(d => JSON.stringify(d)).join('\n').concat('\n'); ` ` `【参考方案2】:

在 node.js 中,您可以使用 node-jq 包来执行 @peak 上面显示的操作。

var stream = require('stream');
var fs = require('fs');
const jq = require('node-jq');

var fileName = 'YOUR_FILE_NAME'; //e.g abc.json
var bucketName = 'YOUR_BUCKET NAME'; // e.g gs://def
var dataStream = new stream.PassThrough();


async function formatJson() 

    jq.run('.[]', fileName, output: 'compact')
    .then((output) => 
        dataStream.push(output)
        dataStream.push(null)
        console.log(dataStream)    
    )
    .catch((err) => 
        console.log(err)
    )


formatJson()

我不是一个有经验的节点人,如果代码很笨拙但可以工作,请见谅。

【讨论】:

【参考方案3】:

将 JSON 数组转换为以换行符分隔的 JSON 实体流的一种方法是将 jq 与 -c 选项一起使用,例如

$ jq -c ".[]"

输入:

[[1,2], 3, "4":5]

输出:

[1,2]
3
"4":5

见https://stedolan.github.io/jq

【讨论】:

jq 看起来是一个很棒的工具。我想此时我的问题是准确理解流媒体的工作原理。我如何能够读取文件,通过 jq 运行它并写入输出?所有有关流式传输的文档(我不需要使用流式传输)都让我非常困惑。 @kisonay - 你根本不需要担心“流解析器”。如果您的 JSON 在文件中,例如 input.json,您可以(例如)将文件名作为命令行参数提供:jq -c ".[]" input.json 你的救星!只是将输出发送到文件> output.txt 正是我需要的。让我把事情复杂化!谢谢。

以上是关于将逗号分隔的 JSON 转换为换行符分隔的节点的主要内容,如果未能解决你的问题,请参考以下文章

将文件读入以逗号和换行符分隔的向量

从用逗号和换行符分隔的文件中读取数组

Bash将多行字符串转换为单个换行符分隔的字符串[重复]

将制表符和换行符分隔的字符串转换为 pandas 数据框

不要在angularjs的textarea中输入超过20个逗号分隔或换行符分隔的序列号和字母数字

将文件中以换行符分隔的 JSON 上传到 BigQuery