将大括号括起来的消息分成多行的最佳方法是什么?

时间:2015-09-25 15:07:08

标签: python json regex unix

我有以下文件,它应该是多行json文件,但一切都在oneline上:

{"id":0, "val":123}{"id":1,"val":345}{"id":2, "val":3434}....

为了将它加载到python中进行分析,我需要先将它分成多行,如下所示:

{"id":0, "val":123}
{"id":1,"val":345}
{"id":2, "val":3434}
...

这样做的最佳工具是什么? AWK? SED?蟒?

5 个答案:

答案 0 :(得分:2)

只需使用python和.replace这样的功能

with open('filename') as f:
    text = f.read().replace('}', '}\n')

with open('filename.edit', 'w') as f:
    f.write(text)

这将在\n之后添加}

答案 1 :(得分:0)

您可以使用正则表达式外观来分割字符串,例如:

(?<=})(?={)

<强> Working demo

import re
p = re.compile(ur'(?<=})(?={)')
test_str = u"{\"id\":0, \"val\":123}{\"id\":1,\"val\":345}{\"id\":2, \"val\":3434}"
subst = u"\n"

result = re.sub(p, subst, test_str)

<强> IdeOne demo

enter image description here

答案 2 :(得分:0)

对于unix工具,请使用awk:

awk -v RS='}' 'NF{print $0 "}"}' file
{"id":0, "val":123}
{"id":1,"val":345}
{"id":2, "val":3434}

或者gnu-sed:

sed 's/}/&\n/g' file
{"id":0, "val":123}
{"id":1,"val":345}
{"id":2, "val":3434}

答案 3 :(得分:0)

这里最简单的方法似乎是使用正则表达式 - 它可以节省编写任何代码的必要性。

例如在Vim中你可以使用这样的东西:%s/}/}\r/g

在任何其他编辑器中,应该\n而不是\r我猜

答案 4 :(得分:0)

也许您的输入非常简单,基于正则表达式的方法就足够了,但是完成您描述的一般任务(即从JSON流生成jsonlines)的最佳方法是使用JSON感知工具。其中之一就是jq。无论如何,以下是简单,快速和有效的:

$ jq -c . input.json

输出当然可以重定向到文件。

(有一点需要注意:jq将输入数字转换为IEEE 754 64位数字,因此输入上的1e1000在输出时变为IEEE 754 64位近似值。)

有关jq的详细信息,请参阅https://stedolan.github.io/jq