4 回答

TA貢獻1803條經(jīng)驗 獲得超3個贊
要快速提取特定鍵的值,我個人喜歡使用“grep -o”,它只返回正則表達式的匹配。例如,要從推文中獲取“文本”字段,請執(zhí)行以下操作:
grep -Po '"text":.*?[^\\]",' tweets.json
這個正則表達式比你想象的更強大; 例如,它可以很好地處理嵌入了逗號并在其中包含轉(zhuǎn)義引號的字符串。我認為通過更多的工作,你可以制作一個實際上可以保證提取值,如果它是原子的。(如果它有嵌套,那么正則表達式當然不能這樣做。)
為了進一步清潔(雖然保持弦的原始逃逸),你可以使用類似的東西:| perl -pe 's/"text"://; s/^"//; s/",$//'
。(我為此分析做了這個。)
對于所有堅持你的仇敵應該使用真正的JSON解析器 - 是的,這對正確性至關(guān)重要,但是
要做一個非常快速的分析,比如計算值以檢查數(shù)據(jù)清理錯誤或獲得對數(shù)據(jù)的一般感覺,在命令行上敲打一些東西會更快。打開編輯器編寫腳本會分散注意力。
grep -o
比Python標準json
庫快幾個數(shù)量級,至少在為推文(每個約2 KB)執(zhí)行此操作時。我不確定這是不是因為json
速度慢(我應該在某個時候與yajl比較); 但原則上,正則表達式應該更快,因為它是有限狀態(tài)并且更加可優(yōu)化,而不是必須支持遞歸的解析器,并且在這種情況下,為您不關(guān)心的結(jié)構(gòu)花費大量CPU構(gòu)建樹。(如果有人寫了一個有限狀態(tài)傳感器,它做了適當?shù)模ㄉ疃认拗频模㎎SON解析,那就太棒了!同時我們有“grep -o”。)
要編寫可維護的代碼,我總是使用真正的解析庫。我沒有嘗試過jsawk,但是如果它運行良好,那將解決點#1。
最后一個更糟糕的解決方案:我編寫了一個腳本,它使用Python json
并將所需的鍵提取到以制表符分隔的列中; 然后我通過一個包裝器管道awk
,允許對列進行命名訪問。 在這里:json2tsv和tsvawk腳本。所以對于這個例子,它將是:
json2tsv id text < tweets.json | tsvawk '{print "tweet " $id " is: " $text}'
這種方法沒有解決#2問題,比單個Python腳本效率更低,而且有點脆弱:它強制對字符串值中的換行符和制表符進行規(guī)范化,以便與awk的字段/記錄分隔的世界視圖一起使用。但它確實讓你留在命令行,更正確grep -o
。
添加回答
舉報