カンマで区切られたCSVがありますが、改行で区切りたいです。
入力する:
a, b, c
出力:
a
b
c
vim
これを行うJavaパーサーを作成しましたが、これを行うために他のツールを使用することはできませんか?
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
答え1
他の答えが望むことを達成しているようで、スクリプト可能なツールが最も適切なオプションであるようです。
しかし、vimについて尋ねるものなので、次のようにすることができます。
%s/, /\r/g
つまり、すべてのカンマ + スペースをキャリッジリターンに置き換えます。これは、ファイルの適切な行末文字として解釈されます。 (検索で確認できます\r
。検索できません。)
答え2
〜のようにイアンの答え、以下を使用することもできますtr
。
$ echo a,b,c | tr ',' '\n'
a
b
c
どちらの答えもCSVが単純であると仮定します(つまり、すべてのカンマはフィールド区切り文字です)。a,"b,c",d
「単一のフィールドはどこにありますか?」などの質問があると、b,c
状況がさらに難しくなります。
答え3
\n
POSIXはsedの代替テキストでの使用を許可しますが、強制しません。 GNU sedはこれを実行できますが、文字通り出力するs
実装もあります。\n
POSIX準拠のawkを使用できます。入力フィールド区切り文字をFS
正規表現に設定し、出力フィールド区切り文字をORS
文字列(通常のバックスラッシュエスケープを使用)に設定します。$1=$
別のフィールド区切り文字を使用するように行を再作成するには、割り当てが必要です。
awk -vFS=', *' -vOFS='\n' '{$1=$1; print}'
(入力内容に引用符なしで通常のカンマとスペースで区切られた値が含まれているとします。引用符がある場合は、PerlやPythonなどの言語で実際のCSVパーサーを使用する必要があります。)
答え4
使用幸せ(以前のPerl_6)
perl6 -pe 's:g/ "," \s /\n/;'
#OR
perl6 -ne '.split(", ").join("\n").put;'
また、挿入された改行文字、引用符内のカンマなどが気になる場合は、RakuText::CSV
モジュールを使用してください。
raku -MText::CSV -e '.join("\n").put for csv(in => lines, sep => ", ");'
入力例:
a, b, c
出力例(上記のすべてのコード):
a
b
c
https://unix.stackexchange.com/a/701805/227738
https://raku.org