如果使用 sed 在 CSV 檔案中的雙引號內找到逗號,則取代逗號

如果使用 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,,,,,

答案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;

相關內容