次のCSVファイルがあります。
1st,2nd,3rd,4th,5th,6th,7th
"first-line
",2,3,4,5,6,7
"second-line
",2,3,4,5,6,7
"third-line
",2,3,4,5,6,7
"normal-line",2,3,4,5,6,7
"forth-line
",2,3,4,5,6,7
"fifth-line
",2,3,4,5,6,7
最初の列の閉じた引用符の前に改行文字を挿入すると、行が壊れているように見えます。対応する改行文字を削除したい。
私は次の解決策を使用しました。この回答ただし、テキストに正しい行(タイトルや「一般行」など)があると、混乱が発生します。
行がダウンしていない場合でもこれを行う方法はありますか?
答え1
新しい回答(2022年10月)、使用ミラー最初の列から末尾のスペースを削除します。
$ mlr --csv put '$["1st"] = rstrip($["1st"])' file
1st,2nd,3rd,4th,5th,6th,7th
first-line,2,3,4,5,6,7
second-line,2,3,4,5,6,7
third-line,2,3,4,5,6,7
normal-line,2,3,4,5,6,7
forth-line,2,3,4,5,6,7
fifth-line,2,3,4,5,6,7
元の引用を維持してください。
$ mlr --csv --quote-original put '$["1st"] = rstrip($["1st"])' file
1st,2nd,3rd,4th,5th,6th,7th
"first-line",2,3,4,5,6,7
"second-line",2,3,4,5,6,7
"third-line",2,3,4,5,6,7
"normal-line",2,3,4,5,6,7
"forth-line",2,3,4,5,6,7
"fifth-line",2,3,4,5,6,7
場所ではなく名前で列を使用していることに注意してください。
以前の回答(2022年6月):
データにその文字が含まれていない@
(そうでない場合は使用されていない他の文字に変更)、含まれているすべての改行を削除したいとします。
$ csvformat -M @ file.csv | tr -d '\n' | tr '@' '\n'
1st,2nd,3rd,4th,5th,6th,7th
first-line,2,3,4,5,6,7
second-line,2,3,4,5,6,7
third-line,2,3,4,5,6,7
normal-line,2,3,4,5,6,7
forth-line,2,3,4,5,6,7
fifth-line,2,3,4,5,6,7
これは以下を使用します。csvformat
csvkitから@
改行文字の代わりにレコードターミネータとして使用されるデータストリームとしてCSVファイルの形式を再指定します。変換されたデータにまだ存在する改行は、tr
後続のコマンドによって削除されます。
次に、2回目の呼び出しで一時レコードの終端を改行文字に戻しますtr
。
引用符が必要なフィールドは、出力から引き続き引用されます。
答え2
これは、引用符付きテキストに6つのカンマが含まれていないと仮定します。
awk -F, '
NR == 1 {num_fields = NF}
NF < num_fields {first=$0; getline; $0 = first FS $0}
{print}
' file
短いPerl:ファイル全体を削除し、引用符の前に改行文字を削除します。
perl -0777 -pe 's/\n(?=",)//g' file
答え3
これを試してみてくださいawk
- 方法:
awk '{while (gsub("\"","&")%2) {getline T; $0 = $0 T}} 1' file
1st,2nd,3rd,4th,5th,6th,7th
"first-line",2,3,4,5,6,7
"second-line",2,3,4,5,6,7
"third-line",2,3,4,5,6,7
"normal-line",2,3,4,5,6,7
"forth-line",2,3,4,5,6,7
"fifth-line",2,3,4,5,6,7
二重引用符の文字数が偶数に達するまで、次の行を追加し続けます。
答え4
使用ミラー本当に簡単です
mlr --csv clean-whitespace input.csv
持つ
1st,2nd,3rd,4th,5th,6th,7th
first-line,2,3,4,5,6,7
second-line,2,3,4,5,6,7
third-line,2,3,4,5,6,7
normal-line,2,3,4,5,6,7
forth-line,2,3,4,5,6,7
fifth-line,2,3,4,5,6,7