Oracle SQL Loaderに次の入力を使用しています。これで、サービスからダウンロードしたCSVファイルにCRLFがあります。
私は前に試しました
dos2unix
tr '\n' ',' < input.txt > output.txt
awk '{printf "%s\r\n", $0}' file
しかし幸運はありません。
サンプル:
"ID","NAME","GROUP","Free Text [CR][LF]
[CR][LF]
[CR][LF]
[CR][LF]
"
"ID1","NAME1","GROUP1","Free Text1 [CR][LF]
"
希望の出力:
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"
役に立つコードやコマンドを提案してください
事前にありがとう
答え1
$ perl -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"
\r$
これは、CRLF(または)で終わる連続行を\r\n
1つの長い行に連結し、その行からすべてのCRLFペアを削除して印刷します。
変更された入力はstdoutとして印刷され、出力は他のファイルにリダイレクトできます。または、対応するオプションを使用してperl
ソース-i
ファイルを変更します。
$ perl -i.bak -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
これはそのまま残りますrgram.txt.bak
。
私は使用するのが好きではありません-i
。標準出力をたとえばにリダイレクトしたいと思いますrgram.new
。標準出力への書き込みはより多様であり(他のプログラムにパイプすることも、プロセスやコマンドの置換などに使用することもできます)、バグが原因で元のファイルが破損する危険性が少なくなります。
rgram.txt
質問に記載されているサンプルデータを含むテキストファイル。
$ sed -n l rgram.txt
"ID","NAME","GROUP","Free Text\r$
\r$
\r$
\r$
"$
"ID1","NAME1","GROUP1","Free Text1\r$
"$
答え2
sed 's/"$//' rgram.csv | sed 's/$/"/' | sed '/^"$/d' > rgram.new.csv
まず、ファイルから最後の「文字を削除してから再度追加してから」で始まる行を削除しました。
答え3
CRLFシーケンスを削除したいが、先行CRなしでLFのみを維持したい場合があるので、次のようにします。
perl -pe 's/\r\n//' < input.txt > output.txt
または:
gawk -v RS='\r\n' -v ORS= 1 < input.txt > output.txt