検証して確認する必要がある約25,000個のJSONファイルがあり、Excelを使用してJSONをCSVに変換すると一部のファイルが重複してエラーが発生することがわかりました。
それ以降のすべての文字列を削除しようとしています。"version":"0.2.3"}
これは、繰り返される前にJSONの終わりを示すためです。"version": "0.2.3"}{"analysis": {
したがって、それ以降のすべてのエントリを保持し"version": "0.2.3"}
て削除し、その変更を25,000ファイルすべてに適用する必要があります。{"analysis": {
人々がgrepとsedを使っているのを見たことがありますが、それを自分で動作させることはできないようです。
誰かが助けてくれたら感謝します。テキストを手動で削除することは望ましくないので、bashなどにライナーがあることを願っています!
以下は変更する必要があります(ファイルの1つの削除されたバージョン)、以下は必要な出力です。ご覧のとおり、何らかの理由でAPIの使用中にJSONデータを独自にコピーできます。
問題のある入力(切り捨てjson
):
{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}
希望の出力:
{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}
答え1
(ほとんどのUnixシリーズシステムで動作します)を使用すると、jq
ファイルから最初のJSONオブジェクトを抽出し、次を使用して残りを破棄できます。
jq -n 'input' file >newfile
これにより、「きれいな印刷」JSONが作成されます。-c
「単純な」出力(スペースが最小化された単一行)を取得するには、このオプションを使用します。出力はに記録されますnewfile
。
このjq
ディレクティブは、input
次の利用可能なJSONオブジェクトを生成します。-n
()を使用して--null-input
基本データの読み取りをオフにし、input
入力ファイルの最初のオブジェクトのみを処理します。
質問に提供されたデータについて、これは次のようになります。
{
"analysis": {
"score": 3
},
"sample": {
"completed": "2022-01-27T21:22:21Z",
"created": "2022-01-27T21:17:57Z",
"id": "220127-z5h84saffl",
"md5": "7871a75734af389b787bad57a3ea087d",
"score": 3,
"sha1": "58a8689ee76a46559ea56a52d20425f44c8ff601",
"sha256": "23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"
},
"version": "0.2.3"
}
その後、元のファイルを結果で上書きします。単一ファイルの全体的な処理は次のとおりです。
jq -n 'input' file >newfile &&
mv newfile file
ファイルが現在のディレクトリにあり、特定のパターンと一致すると仮定すると、単純な*.json
シェルループですべてのファイルを次のように処理できます。
for name in *.json; do
cp -- "$name" "$name.orig" &&
jq -n 'input' <"$name.orig" >"$name"
done
これは私が示したものとは少し異なり、元のコンテンツを.orig
ファイル名サフィックスを使用してファイルに保存し、元のファイルのメタデータ(権限など)が変更されないようにします。これを正しく行ったと確信したら、.orig
ファイル名のサフィックスが付いたファイルを削除できます。
必ず適切にバックアップされたデータに対してこれらのテストを実行してください。
また、これらのファイルをCSVに変換すると言っていましたが、何が必要なのかは言及していません。sample
キーをヘッダーとして使用してデータをCSV形式にしたいとします。
jq -n -r 'input | .sample | keys, [.[]] | @csv' file
JSON文字列の代わりにデコードされたデータを提供するには、Option()が必要です-r
。--raw-output
特定の文書について以下を提供します。
"completed","created","id","md5","score","sha1","sha256"
"2022-01-27T21:22:21Z","2022-01-27T21:17:57Z","220127-z5h84saffl","7871a75734af389b787bad57a3ea087d",3,"58a8689ee76a46559ea56a52d20425f44c8ff601","23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"
答え2
使用幸せ(以前のPerl_6)
入力例(無効なJSON):
~$ cat file.json
{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}{"analysis":{"score":3},"sample":{"completed":"2022-01-27T21:22:21Z","created":"2022-01-27T21:17:57Z","id":"220127-z5h84saffl","md5":"7871a75734af389b787bad57a3ea087d","score":3,"sha1":"58a8689ee76a46559ea56a52d20425f44c8ff601","sha256":"23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a"},"version":"0.2.3"}
出力例(Rakuのハッシュ形式):
~$ cat file.json | raku -MJSON::Stream -e 'my @a; \
react whenever json-stream($*IN.Supply, [q[$], *][0],) {@a.push($_.values)}; \
"\n".print; .say for @a.[0].hash;'
sample => {completed => 2022-01-27T21:22:21Z, created => 2022-01-27T21:17:57Z, id => 220127-z5h84saffl, md5 => 7871a75734af389b787bad57a3ea087d, score => 3, sha1 => 58a8689ee76a46559ea56a52d20425f44c8ff601, sha256 => 23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a}
version => 0.2.3
analysis => {score => 3}
上記では、Rakuのモジュールを使用して不完全なJSONを読み取ることができますJSON::Stream
。これはJSONストリームパーサ(EOFに到達する前に解析)なので、JSONを検証しないためです。この場合は幸運でした。配列から誤った2番目の要素を削除するには、呼び出しを使用します@a.[0].hash
(@a.head.hash
また動作します)。
最終フォーマットの出力は、RakuモジュールのコマンドをJSON
使用して行われます。全体的に私たちがしたことは次のとおりです。to-json()
JSON::Tiny
最終的なJSON出力(Rakuモジュールのみを使用):
~$ cat Jarvis4444.json | raku -MJSON::Stream -MJSON::Tiny -e 'my @a; \
react whenever json-stream($*IN.Supply, [q[$], *][0],) {@a.push($_.values)}; \
"\n".print; to-json(@a.[0].hash).put;'
{ "version" : "0.2.3", "sample" : { "score" : 3, "created" : "2022-01-27T21:17:57Z", "sha1" : "58a8689ee76a46559ea56a52d20425f44c8ff601", "id" : "220127-z5h84saffl", "sha256" : "23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a", "md5" : "7871a75734af389b787bad57a3ea087d", "completed" : "2022-01-27T21:22:21Z" }, "analysis" : { "score" : 3 } }
他の答えと比較するために、上記のJSON出力を|
パイプすることができますjq
。
{
"sample": {
"completed": "2022-01-27T21:22:21Z",
"score": 3,
"sha1": "58a8689ee76a46559ea56a52d20425f44c8ff601",
"md5": "7871a75734af389b787bad57a3ea087d",
"id": "220127-z5h84saffl",
"sha256": "23c5dee027c7969aabb5828641c55a005f30fb166a5006dbe3a817f56ca0e32a",
"created": "2022-01-27T21:17:57Z"
},
"version": "0.2.3",
"analysis": {
"score": 3
}
}
[複数のファイル処理:もちろん、@Kusalanandaの答えは、複数のファイルを処理するためのシェルループを作成し、各ファイルを変更/保存するための十分なガイドラインを提供します。]
https://github.com/moritz/json
https://github.com/FCO/JSON-Stream
https://raku.org