csvファイルには、" "で囲まれたデータとカンマで区切られたフィールドがあります。これを別のものに置き換えたいのですが

csvファイルには、" "で囲まれたデータとカンマで区切られたフィールドがあります。これを別のものに置き換えたいのですが

以下はファイルの最初の 5 行です。ここでは、5 列目の「10,00,000.0」を「10,000,000.0」に置き換えます。

DE000A2200V7,09:30:00,8.5,8.509,"10,00,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,00,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

答え1

CSVの区切り文字を一時的に@(またはデータに含まれていない他の文字)csvformatに変更することで、csvkit、5 番目のフィールドの関連文字列を に変更しawk、区切り文字を元のカンマに戻します。

csvformat -D '@' data.csv |
awk 'BEGIN { OFS=FS="@" } $5 == "10,00,000.0" { $5 = "10,000,000.0" }; 1' |
csvformat -d '@'

のデータを使用するとdata.csv、次の結果が生成されます。

DE000A2200V7,09:30:00,8.5,8.509,"10,000,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,000,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

答え2

sed次のコマンドでこれを実行できます。

sed -i 's/^\(\([^,]*,\)\{4\}\)\("[^"]*"\)\(.*\)$/\1"10,000,000.0"\4/' data.csv

答え3

「20,00,000.0」が正しいですか?そうでない場合は、

sed 's/,00,/,000,/' file

sすべての間違った番号を修正する必要がある場合は、フラグを追加しますg...

答え4

GNUでawk

awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '$5 == "\"10,00,000.0\"" \
{ $5="\"10,000,000.0\""}; {print}' file

テスト

$ cat file
DE000A2200V7,09:30:00,8.5,8.509,"10,00,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,00,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

$ awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '$5 == "\"10,00,000.0\"" { $5="\"10,000,000.0\""}; {print}' file
DE000A2200V7,09:30:00,8.5,8.509,10,000,000.0,"10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,10,000,000.0,"10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

説明

-vFPAT='([^,]*)|("[^"]+")' 

フィールドをカンマで区切り、フィールドに埋め込まれたカンマが含まれる可能性がある場合に対応します(GNU awkマニュアルを参照)。コンテンツによるフィールドの定義)。

-vOFS=,

出力ファイルの区切り文字がコンマであることを示します,

'$5 == "\"10,00,000.0\"" { $5="\"10,000,000.0\""}; {print}'

5 列目が文字列「10,00,000.0」と一致する場合は、それを「10,000,000.0」に置き換え、その行を出力します。

関連情報