2017-11-06 8 views
-1

私はいくつかの巨大な(2GB以上の)JSONファイルが,\n]で終わっています。私は,\nを削除してから]に戻って追加する必要が大きなJSONファイルから最後の数文字を削除します

test.json

":{"value":false}}}}}}, 
    ] 

:ここでは2ギガバイトJSONファイルの最後の25個の文字である、私のテストファイルの例です。最終行の最後の3文字。ファイル全体は3行で表示されます:前括弧と末尾括弧はそれぞれ独自の行にあり、JSON配列のすべての内容は2行目にあります。ファイルがあまりにも大きいため

string[0..-2] 

は、私のような何かをメモリにストリーム全体をロードすることはできません。私は、Rubyのを含め、several approachesを試してみました:

chomp!(",\n]") 

とUNIXの:

sed 

どちらも私のJSONファイルへの変更をしませんでした。

ともなかったが:

ls -l 

新旧ファイルのバージョンのバイトサイズが同じであったことを確認するために私が行って、最後の25個の文字を見ました。

これらのアプローチのいずれも機能していない理由を知ってもらえますか?

+2

JSONファイルは、ある時点で文字列に変換されていない限り、最初にそのようなエンコーディングを持つべきではありません。 JSONファイルはどのように生成されましたか?ファイルでJSON.parseを実行するとどうなりますか? –

+3

合意した、それは無効なjsonです、あなたは間違った問題を解決しています。 – rebroken

+0

test.jsonは、有効な2GBのjsonファイルの最後の25文字です。 jsonの内容は有効なjsonです。ただし、json配列の最後の要素は、最後の末尾の括弧の前にコンマが付きます。 2GBのjsonファイルを投稿することはできませんでした。なぜならその内容は独自のものだからです。基本的な問題が何であるか、つまりファイルが非常に大きいときに最後の3文字を変更する方法を示したかったのです。 – areyoujokingme

答えて

2

このような外科手術をしたい場合は、ファイル全体を読む必要はありません。代わりに、あなただけのファイルの最後の数バイトを上書きすることができます。

file = 'huge.json' 

IO.write(file, "\n]\n", File.stat(file).size - 5) 

ここで重要なのは、端からあなたはバックトラックとしてアウトなど、多くのバイトを書くことで、そうしないと、ファイルの長さをトリミングする必要があります、必要であればtruncateでそれを行うこともできます。

+1

ファイル.truncateは本当にうまくいっていました。そして、最後の括弧を追加するためにecho -n "]"を実行しました。助けてくれてありがとう、@タッドマン! – areyoujokingme

関連する問題