web-dev-qa-db-ja.com

新しい行を見つけて置き換えるにはどうすればよいですか?

カンマで区切られた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
3
simpatico

イアンの答え と同様に、trも使用できます。

$ echo a,b,c | tr ',' '\n'
a
b
c

どちらの回答も、CSVが単純であることを前提としています(つまり、すべてのコンマはフィールド区切り文字です)。 a,"b,c",d どこ b,cは単一のフィールドなので、状況はさらに難しくなります

6
Michael Mrozek

他の答えはあなたが望むものを達成するようであり、スクリプト可能なツールが最も適切な選択のようです。

しかし、vimについて質問したので、ここでその方法を説明します。

%s/, /\r/g

つまり、すべてのコンマ+スペースをキャリッジリターンで置き換えます。これは、ファイルの適切な行終了文字として解釈されます。 (これを確認するには、\rを検索してください-見つかりません)。

5
Edd Steel

ファイルが '、'(コンマの後にスペースが続く)で区切られている場合

sed 's/, /\n/g' filename.csv >newfile

仕事をします。 '、'(スペースなしのコンマ)で区切られている場合

sed 's/,/\n/g' filename.csv >newfile

動作します。

または\nから\o12 sedの味が気に入らない場合。

2
user591

Sedのs置換テキストで\nを使用することは、POSIXでは許可されていますが、必須ではありません。 GNU sedはそれを行いますが、\nを文字どおりに出力する実装があります。

POSIX準拠のawkを使用できます。入力フィールド区切り文字FSを正規表現に設定し、出力フィールド区切り文字ORSを文字列に設定します(通常のバックスラッシュエスケープを使用)。別のフィールド区切り記号を使用するように行を再構築するには、割り当て$1=$が必要です。

awk -vFS=', *' -vOFS='\n' '{$1=$1; print}'

(これは、入力に引用符なしのカンマと空白で区切られたプレーンな値が含まれていることを前提としています。引用符がある場合は、PerlやPythonなどの言語で実際のCSVパーサーに移動する必要があります。)