引用符の中にカンマを入れてcsvファイルをパイプ(|)で区切られたファイルに変換するには、シェルスクリプトが必要です。

引用符の中にカンマを入れてcsvファイルをパイプ(|)で区切られたファイルに変換するには、シェルスクリプトが必要です。

サンプルファイル(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認識ツールを使用しますcsvformatcsvkit)とミラー( 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!##!

関連情報