2016-07-26 10 views
2

私はMacで動作しており、100kを超える非常に大きな.jsonファイルを持っています。Macで複数のファイルに.jsonファイルを分割

私は、ファイルを複数のファイル(好ましくは50-100)に分割したいと考えています。

SOURCEファイル

は、元の.jsonファイルは、多次元配列であり、ビットのようになります。これは、3つのファイルに分割された場合

[{ 
    "id": 1, 
    "item_a": "this1", 
    "item_b": "that1" 
}, { 
    "id": 2, 
    "item_a": "this2", 
    "item_b": "that2" 
}, { 
    "id": 3, 
    "item_a": "this3", 
    "item_b": "that3" 
}, { 
    "id": 4, 
    "item_a": "this4", 
    "item_b": "that4" 
}, { 
    "id": 5, 
    "item_a": "this5", 
    "item_b": "that5" 
}] 

所望の出力

出力は次のようになります:

ファイル1:

[{ 
    "id": 1, 
    "item_a": "this1", 
    "item_b": "that1" 
}, { 
    "id": 2, 
    "item_a": "this2", 
    "item_b": "that2" 
}] 

ファイル2:

[{ 
    "id": 3, 
    "item_a": "this3", 
    "item_b": "that3" 
}, { 
    "id": 4, 
    "item_a": "this4", 
    "item_b": "that4" 
}] 

ファイル3:

[{ 
    "id": 5, 
    "item_a": "this5", 
    "item_b": "that5" 
}] 

任意のアイデアは、非常に高く評価されるだろう。ありがとうございました!救助へ

答えて

3

たPerl:chorobaの答え@

#!/usr/bin/perl 
use warnings; 
use strict; 

use JSON; 

my $file_count = 5; # You probably want 50 - 100 here. 

my $json_text = do { 
    local $/; 
    open my $IN, '<', '1.json' or die $!; 
    <$IN> 
}; 
my $arr = decode_json($json_text); 
my $size = @$arr/$file_count; 
my $rest = @$arr % $file_count; 

my $i = 1; 
while (@$arr) { 
    open my $OUT, '>', "file$i.json" or die $!; 
    my @chunk = splice @$arr, 0, $size; 
    ++$size if $i++ >= $file_count - $rest; 
    print {$OUT} encode_json(\@chunk); 
    close $OUT or die $!; 
} 
3

は非常に効果的かつ柔軟です。 私はjqのbashソリューションを持っています。

#!/bin/bash 
i=0 
file=0 
for f in `cat data.json | jq -c -M '.[]'`; 
do 

    if [ $i -eq 2 ]; then 

     ret=`jq --slurp "." /tmp/0.json /tmp/1.json > File$file.json`; 
     ret=`rm /tmp/0.json /tmp/1.json`; #cleanup 

     ((file = file + 1)); 
    i=0 
    fi 
    ret=`echo $f > /tmp/$i.json`; 
    ((i = i + 1)); 
done 
if [ -f /tmp/0.json ]; then 
    ret=`jq --slurp '.' /tmp/0.json > File$file.json`; 
    ret=`rm /tmp/0.json`; #cleanup 
fi 
1
$ cat tst.awk 
/{/ && (++numOpens % 2) { 
    if (++numOuts > 1) { 
     print out, "}]" 
     close(out) 
    } 
    out = "out" numOuts 
    $0 = "[{" 
} 
{ 
    # print > out 
    print out, $0 
} 

$ awk -f tst.awk file 
out1 [{ 
out1  "id": 1, 
out1  "item_a": "this1", 
out1  "item_b": "that1" 
out1 }, { 
out1  "id": 2, 
out1  "item_a": "this2", 
out1  "item_b": "that2" 
out1 }] 
out2 [{ 
out2  "id": 3, 
out2  "item_a": "this3", 
out2  "item_b": "that3" 
out2 }, { 
out2  "id": 4, 
out2  "item_a": "this4", 
out2  "item_b": "that4" 
out2 }] 
out3 [{ 
out3  "id": 5, 
out3  "item_a": "this5", 
out3  "item_b": "that5" 
out3 }] 

ちょうど print out, $0、あなたがテストした後にコメントを解除 # print > outを削除し、それに満足しています。

+0

ありがとうございました。私はこれがとても近いと思う。テスト中に私の端末に正しく印刷されますが、 'print $ 0'を取り除いて'#print $ 0> out'のコメントを外すと、out1とout2の終わりが端末に表示されますが、ファイルには含まれません。 '}]'は中止され、端末に表示されます。どのように解決するかについての任意のアイデア?ありがとうございました! – Brandon

+0

間違っているか、コメントを外して貼り付けておく必要があります。私が投稿したスクリプト**は、あなたが何を記述しているのかはわかりません。実行しているスクリプトを表示するために質問を編集すると、デバッグに役立ちます。 –

+0

キーや値に '{'文字が含まれていると、これは失敗します。 –

関連する問題