我有以下文件,它应该是多行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?蟒?
答案 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 强>
答案 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