引用符の中に引用符と改行文字がありますが、単一の列にはない奇妙なCSVファイルがあります。これで、列を「改行」として識別し、改行をいくつかの区切り文字に置き換える必要があります。
3つの列があり、3番目の列には二重引用符と各特殊文字を含むHTMLテキストが含まれています。ただし、二重引用符はのような二重引用符でエスケープされます"<This ""is"" string>"
。
入力する:
ID、名前、文字
"1","abc","Line 1"
"2","def","Line2
""line2"",line2"
"3","ghi","line3"
出力:
ID, Name, text
"1","abc","Line 1"
"2","def","Line2 ""line2"",line2"
"3","ghi","line3"
ベストアンサー1
ファイルに実際の問題はありません。改行と二重引用符が含まれています。 CSVパーサーはこれを正しく処理します。エスケープされた二重引用符"
(二重引用符フィールドの間)を使用することは、CSVファイルに含まれる二重引用符をエスケープする正しい方法です。
交換埋め込みCSVファイルに@
改行文字を含めるには:
$ csvformat -M '@' file.csv | tr '\n@' '@\n'
1,abc,Line 1
2,def,"Line2@""line2"",line2"
3,ghi,line3
これはcsvformat
以下で使用されます。csvkitツールキット。これはCSVファイルを再フォーマットできる適切なCSVパーサーです。
上記のコマンドパイプラインは最初にすべての改行を置き換えます。いいえ役割が含まれます@
。その後、tr
残りの改行文字と@
文字を置き換えて、改行文字を含むCSVファイルに仕上げました@
。
これは、ファイルの元のデータに文字が含まれていないという事実に依存します@
。
改行文字が元々あった場所の代わりに空白のあるトークンが必要な場合は、上記のトークンを代わりtr '\n@' ' \n'
に使用してください。tr
$ csvformat -M '@' file.csv | tr '\n@' ' \n'
1,abc,Line 1
2,def,"Line2 ""line2"",line2"
3,ghi,line3
これにより、元の改行文字を再挿入することが不可能ではない場合でも、非常に困難になります。その他データの空白(たとえば、最初の行の3番目のフィールドの空白)
csvformat
不要な二重引用符をすべて削除せずに次のように使用しますか-U 1
?
$ csvformat -U 1 -M '@' file.csv | tr '\n@' ' \n'
"1","abc","Line 1"
"2","def","Line2 ""line2"",line2"
"3","ghi","line3"
Millerを使用してより簡単な答えを得る(2022年10月):
$ cat file
ID,Name,text
"1","abc","Line 1"
"2","def","Line2
""line2"",line2"
"3","ghi","line3"
$ mlr --csv put '$text = gsub($text,"\n"," ")' file
ID,Name,text
1,abc,Line 1
2,def,"Line2 ""line2"",line2"
3,ghi,line3
その後、CSVファイル(通常のヘッダーと仮定)を読み取り、gsub()
フィールドの改行を空白に置き換えます。text