
我有一個 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,,,,,
答案1
csv 文件可能非常棘手。您最終可能會在行中的某個位置出現轉義引號,而要處理的正規表示式將不可讀取且容易出錯。
我建議使用類似的工具履歷工具包或 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])
答案2
正如@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",,,,,
這使用了與以下相同的技巧這裡,僅恢復:而不是修改部分外部引號,我正在修改部分裡面引號。
答案3
我發現的最佳答案是透過添加以下行來使用 MySQL 本身:
OPTIONALLY ENCLOSED BY '"'
例如,載入查詢如下所示:
LOAD DATA INFILE 'filename.csv' INTO TABLE table_name
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
IGNORE 1 LINES;