sedを使用してCSVファイルの二重引用符内にある場合は、カンマを置き換えます。

sedを使用してCSVファイルの二重引用符内にある場合は、カンマを置き換えます。

MySQLテーブルにロードする必要があるCSVファイルがあります。私は,文字で終わる列を識別することに頼っています。そのため、,列区切り記号を除いて他の場所に表示されないことが重要です。

,一部の行には、内部に二重引用符付きの列が含まれていることがわかりました。たとえば、次のような行があります。

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からファイルをロードするときに内部二重引用,符が区切り文字と見なされないように、内部二重引用符を置き換えました。二重引用符も必要ないので削除しました。;,,"

次のように、CSVファイルの各行に対してこの操作を自動的に実行するためにsedを使用しようとしています。

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;

関連情報