2016-03-15 58 views
-1

我通過連接到某些API的腳本創建了超過500 000個JSON文檔。我想將這些文檔導入到RethinkDB中,但似乎RethinkDB不能大量導入文件,所以我想將所有這些文件合併成一個大的JSON文件(比如bigf​​ile.json)。這裏是它們的結構:如何合併成千上萬的json文檔?

文件1.json:

{ 
    "key_1": "value_1.1", 
    "key_2": "value_1.2", 
    "key_3": "value_1.3", 
    ... 
    "key_n": "value_1.n" 
} 

文件2.json:

{ 
    "key_1": "value_2.1", 
    "key_2": "value_2.2", 
    "key_3": "value_2.3", 
    ... 
    "key_n": "value_2.n" 
} 
... 

文件n.json:

{ 
    "key_1": "value_n.1", 
    "key_2": "value_n.2", 
    "key_3": "value_n.3", 
    ... 
    "key_n": "value_n.n" 
} 

我想知道這會是創建一個大JSON文件的最佳結構(要完整,每個文件都有一個由3個變量組成的特定名稱,第一個是tim estamp(YYYYMMDDHHMMSS)),以及哪個命令或腳本(直到現在我只爲bash寫腳本...)才能讓我產生合併。

+0

輸出文件應該如何查看?文件的名稱與它有什麼關係 - 爲什麼這很重要?它出現在文件中還是應該出現? –

+0

輸出將是一個很大的json文件。我想過看起來像{「bigfile」:[file_1,file_2,...,file_n]}的東西,但我不知道它是否是大文件的最佳結構(輸出會超過1千兆)。這些文件的名字沒有出現在這些文件中,但我想也許我應該讓它們出現在大文件中,因爲它們部分地描述了輸入文件。 – crocefisso

+0

你沒有太大的幫助。 'yes> file.json'生成一個很大的JSON文件。 –

回答

4

您提到了bash,所以我假定您使用* nix,您可以使用echo,catsed來實現您想要的效果。下面

$ ls 
file1.json file2.json merge_files.sh output 
$ cat file1.json 
{ 
    "key_1": "value_1.1", 
    "key_2": "value_1.2", 
    "key_3": "value_1.3", 
    "key_n": "value_1.n" 
} 
$ ./merge_files.sh 
$ cat output/out.json 
{ 
"file1": 
{ 
    "key_1": "value_1.1", 
    "key_2": "value_1.2", 
    "key_3": "value_1.3", 
    "key_n": "value_1.n" 
}, 
"file2": 
{ 
    "key_1": "value_2.1", 
    "key_2": "value_2.2", 
    "key_3": "value_2.3", 
    "key_n": "value_2.n" 
} 
} 

腳本讀取一個文件夾中的所有文件,JSON,並將它們連接成與文件名作爲關鍵字的「大」的文件。

#!/bin/bash 

# create the output directory (if it does not exist) 
mkdir -p output 
# remove result from previous runs 
rm output/*.json 
# add first opening bracked 
echo { >> output/tmp.json 
# use all json files in current folder 
for i in *.json 
do 
    # first create the key; it is the filename without the extension 
    echo \"$i\": | sed 's/\.json//' >> output/tmp.json 
    # dump the file's content 
    cat "$i" >> output/tmp.json 
    # add a comma afterwards 
    echo , >> output/tmp.json 
done 
# remove the last comma from the file; otherwise it's not valid json 
cat output/tmp.json | sed '$ s/.$//' >> output/out.json 
# remove tempfile 
rm output/tmp.json 
# add closing bracket 
echo } >> output/out.json 
+2

'因爲我在* .json'會更好。另外,你應該雙引號'$ i',看起來像這個'cat「$ i」>> ...'。 –

+0

哇!非常感謝。不僅它工作得很好,而且由於你的教學技巧,我明白了一切。最好的答案!只有一個問題,'。$'在sed's /.$//'中(如果沒有提到逗號,它是如何移除逗號的,是刪除最後一個字符串?)? – crocefisso

+1

@crocefisso,幾乎正確。它是一個正則表達式,它刪除最後一行輸入的最後一個字符。看看[這裏](http://stackoverflow.com/a/27327973/1617563) – aleneum

1

可以使用linux上的單個命令行完成。從目錄,所有的JSON文件,創建一個新的目錄(說「產出」),然後啓動

jsonlint -v -f *.json > output/bigfile.json 

jsonlint source

Jsonlint manual for ubuntu

+0

請添加一個說明,並說明可以獲取哪些jsonlint,以及支持哪些平臺。 – mklement0

0

如果你需要閱讀了一堆的JSON文件作爲一個單一的對象文件名作爲鍵和內容作爲相應的值,考慮使用jq

jq -n '[inputs|{(input_filename):.}]|add' FILE...