サンプルファイル(test.csv):
"PRCD-15234","CDOC","12","JUN-20-2016 17:00:00","title, with commas, ","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","title without comma","Y!##!"
結果ファイル:
PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!
動作しない私のスクリプトは次のとおりです。
while IFS="," read f1 f2 f3 f4 f5 f6;
do
echo $f1|$f2|$f3|$f4|$f5|$f6;
done < test.csv
答え1
(generate output) | sed -e 's/","/|/g' -e 's/^"//' -e 's/"$//'
または
sed -e 's/","/|/g' -e 's/^"//' -e 's/"$//' $file
3つの表現の場合:
-e 's/","/|/g'
= すべての区切り記号を","
新しい区切り記号に置き換える|
-e 's/^"//'
=先行"
タグを削除-e 's/"$//'
= 行末マークの"
削除
これにより、最初の区切り文字パターンと一致しない限り、ヘッダーに表示される引用符が保持されます。","
答え2
どうですか?
cat test.csv | sed 's/\",\"/|/g' | sed 's/\"//g'
ファイルのデータが上記の方法であると仮定すると(私は特別なケースを考慮しません)、しかし上記は私にとって効果的です。
答え3
これは埋め込み文字列区切り文字を処理します。
$ cat /tmp/bla
"PRCD-15234","CDOC","12","JUN-20-2016 17:00:00","title, with commas, ","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","title without comma","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","embedded\",delimiters\",","Y!##!"
sed -E 's/"(([^"]*(\\")?)*)",/\1|/g;s/"|(([^"]*(\\")?)*)"/\1/g'
→
PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|embedded\",delimiters\",|Y!##!
答え4
あなたのスクリプトはCSVパーサーのように引用されたフィールドを解析しないので動作しません。つまり、フィールドを区切り文字として参照するコンマを処理します。
2つのCSV認識ツールを使用しますcsvformat
(csvkit)とミラー( mlr
):
$ csvformat -D '|' file
PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!
$ mlr --csv --ofs pipe cat file
PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!