CSV形式が必要

CSV形式が必要

以下の値の例を含むCSVファイルがあります。

"Basic","""21,21""","[""21"",""21""]","","","","",""

2および3などの一部の列から追加の二重引用符を削除する必要があります。

期待される出力は次のとおりです

"Basic","21,21","[21,21]","","","","",""

awk、sed、または他のLinuxツールを使用してこれをどのように達成できますか?

以下にファイルの例を示します。この列の値は常に[]にあり、[]内の引用符を削除する必要があります。

"Basic","""40""","[""40""]","""13F""","[""13F""]","","" 
"Basic","""0""","[""0""]","","","""MCOMB""","[""MCOMB""]"

答え1

理解するCSVパーサーを使用してください。CSV引用符付きフィールドに引用符、カンマなどを挿入することは、単純なカンマ区切りフィールドよりも少し複雑です。

ミラー以下のような良いコマンドラインツールです。csvkit

または、PerlやPythonなどの言語でcsv解析ライブラリを使用します。テキスト::CSVパールの場合データセットPythonの場合。

Linuxを使用している場合は、使用しているディストリビューションに関係なく、それらすべてをパッケージ化することができます。

答え2

答え3

sed解決策があります。

sed -e 's/,"""/,"/g' -e 's/""",/",/g' -e 's/\([^,]\)""/\1/g' -e 's/""\([^,]\)/\1/' 

これは作る

"Basic","40","[40]","13F","[13F]","",""
"Basic","0","[0]","","","MCOMB","[MCOMB]"
"Basic","21,21","[21,21]","","","","",""

sedコマンドはとても簡単です。

  • 's/,"""/,"/g'次の項目をすべて,"""置き換えます。,"g
  • 's/\([^,]\)""/\1/g'非カンマ文字[^,]と2つの"記憶文字を検索し、\( \)記憶文字に置き換えます。\1

行末の末尾のスペースは、最後のスペースを削除します。""

@casが指摘したように、csvツールを使用すると長期的には良いでしょう。

答え4

データからすべての二重引用符、つまりCSV形式の二重引用符と、引用符、カンマ、および改行を引用するのに必要な二重引用符ではなく、すべての二重引用符を削除するとします。

csvformatcsvkit を使用してtr各フィールドの内部参照を削除します。

$ cat file
"Basic","""40""","[""40""]","""13F""","[""13F""]","",""
"Basic","""0""","[""0""]","","","""MCOMB""","[""MCOMB""]"
"Basic","""21,21""","[""21"",""21""]","","","","",""
$ csvformat -Q "'" file | tr -d '"' | csvformat -q "'"
Basic,40,[40],13F,[13F],,
Basic,0,[0],,,MCOMB,[MCOMB]
Basic,"21,21","[21,21]",,,,,

上記のパイプラインは、まずCSVファイルで使用されている引用符文字を二重引用符から一重引用符に変更します。このtrコマンドは、残りの二重引用符(部分データ)をすべて削除します。最後のcsvformatコマンドは、データを二重引用符を使用して再変換します。

空のフィールドを含むすべてのフィールドを参照する必要がある場合は、2番目の呼び出しに追加して-U 1くださいcsvformat。デフォルトでは、csvkitユーティリティは必要なフィールドに対してのみ引用符を出力します。

関連情報