Sed
如果使用 sed 在 CSV 文件的雙引號內找到逗號,則替換逗號
我有一個 CSV 文件,我需要將其載入到 MySQL 表中。我依靠辨識以字元結尾的列
,
。這就是為什麼,
除了作為列分隔符之外不出現在其他地方很重要的原因。我發現一些行包含一個帶有
,
雙引號的列。例如這樣的一行:12,"name, brand - something, something",age,sex,,,,"name, brand - something, something, something",,,,,
需要轉換為:
12,name; brand - something; something,age,sex,,,,name; brand - something; something; something,,,,,
如您所見,我將
,
內部雙引號替換為,;
以便當我在 MySQL 中載入文件時,,
內部雙引號不再被視為分隔符,
。我還刪除了雙引號"
,因為它們不需要。我嘗試使用 sed 為 CSV 文件中的每一行自動執行此操作,如下所示:
sed -e 's/"\*,\*"/"\*;\*"/g' -e 's/"//g' input.csv > output.csv
但是結果並沒有用 . 替換
,
雙引號裡面的那個;
。它只刪除了雙引號:12,name, brand - something, something,age,sex,,,,name, brand - something, something, something,,,,,
csv 文件可能非常棘手。您最終可能會在該行的某處使用轉義引號,而要處理的正則表達式將不可讀且容易出錯。
我建議使用cvskit 之類的工具或 perl 或 python 中的小腳本。這個用python快速製作的程序應該可以做到:
import csv with open('input.csv',mode='r') as csv_file: csv_reader = csv.reader(csv_file) for row in csv_reader: print (',').join([f.replace(',',';') for f in row])
正如@steeldriver 已經提到的那樣,如果使用正確的選項
mysql
,可能知道要處理這個問題,但是 FWIW 你可以用 awk 做到這一點:awk -v RS='"' -v ORS= 'NR % 2 || gsub(/,/,";") || 1' 12,name; brand - something; something,age,sex,,,,name; brand - something; something; something,,,,,
或者,在保留封閉引號的同時:
awk -v RS='"' -v ORS= '{if(NR % 2) print; else{gsub(/,/,";");print RS $0 RS}}' 12,"name; brand - something; something",age,sex,,,,"name; brand - something; something; something",,,,,
這是使用與此處相同的技巧,只是還原:我沒有修改引號外的部分,而是修改引號**內的部分。