Sed

如果使用 sed 在 CSV 文件的雙引號內找到逗號,則替換逗號

  • April 14, 2020

我有一個 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",,,,,

這是使用與此處相同的技巧,只是還原:我沒有修改引號外的部分,而是修改引號**內的部分。

引用自:https://unix.stackexchange.com/questions/576804