2015-09-25 43 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