カンマで区切られたCSVがあり、代わりに改行で区切りたい。
入力:
a, b, c
出力:
a
b
c
私はJavaこれを行うパーサーを記述しましたが、これはvim
または他のツールで実行できませんでしたか?
sed
が機能しません。
#!/bin/sh
# Start
cat > infile.csv << __EOF__
a, b, c
__EOF__
cat infile.csv
sed 's/, /\n/g' infile.csv > outfile.csv
cat outfile.csv
イアンの答え と同様に、tr
も使用できます。
$ echo a,b,c | tr ',' '\n'
a
b
c
どちらの回答も、CSVが単純であることを前提としています(つまり、すべてのコンマはフィールド区切り文字です)。 a,"b,c",d
どこ b,c
は単一のフィールドなので、状況はさらに難しくなります
他の答えはあなたが望むものを達成するようであり、スクリプト可能なツールが最も適切な選択のようです。
しかし、vimについて質問したので、ここでその方法を説明します。
%s/, /\r/g
つまり、すべてのコンマ+スペースをキャリッジリターンで置き換えます。これは、ファイルの適切な行終了文字として解釈されます。 (これを確認するには、\r
を検索してください-見つかりません)。
ファイルが '、'(コンマの後にスペースが続く)で区切られている場合
sed 's/, /\n/g' filename.csv >newfile
仕事をします。 '、'(スペースなしのコンマ)で区切られている場合
sed 's/,/\n/g' filename.csv >newfile
動作します。
または\n
から\o12
sedの味が気に入らない場合。
Sedのs
置換テキストで\n
を使用することは、POSIXでは許可されていますが、必須ではありません。 GNU sedはそれを行いますが、\n
を文字どおりに出力する実装があります。
POSIX準拠のawkを使用できます。入力フィールド区切り文字FS
を正規表現に設定し、出力フィールド区切り文字ORS
を文字列に設定します(通常のバックスラッシュエスケープを使用)。別のフィールド区切り記号を使用するように行を再構築するには、割り当て$1=$
が必要です。
awk -vFS=', *' -vOFS='\n' '{$1=$1; print}'
(これは、入力に引用符なしのカンマと空白で区切られたプレーンな値が含まれていることを前提としています。引用符がある場合は、PerlやPythonなどの言語で実際のCSVパーサーに移動する必要があります。)