2015-09-25 46 views
1

我有以下的文件,它应该是多行的JSON文件,但是一切都在ONELINE:将花括号封闭的消息拆分为多行的最佳方法?

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

为了将其加载到蟒蛇做分析,我需要把它分成多行首先,像这样:

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

什么是最好的工具呢? AWK? SED?蟒蛇?

回答

2

只需使用Python和.replace功能这样

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

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

这将}之后添加\n

0

您可以使用正则表达式lookarounds分割你的字符串,例如:

(?<=})(?={) 

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

+0

我相信'正则表达式'模块是这种方法的工作所必需的。 're'不能用空字符串分割。你是否在代码中尝试过? –

+0

嗨@stribizhev,我只是写了这个想法不是一个完整的工作示例。现在更新,感谢评论 –

+0

我似乎误解了我,请[看看Python代码](http://ideone.com/fDc8rO)。字符串不分割:'[''“id”:0,“val”:123} {“id”:1,“val”:345} {“id”:2,“val”:3434}' ]' –

0

对于UNIX工具使用AWK:

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

或者GNU-SID:

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

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

例如在Vim中,你可以使用类似这样:%s/}/}\r/g

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

0

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

$ jq -c . input.json 

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

(有一点需要注意:JQ输入数字转换为IEEE 754 64位数字,于是1e1000上输入变为上输出其IEEE 754的64位近似。)

有关JQ详情,请参见https://stedolan.github.io/jq