O que posso fazer se o delimitador do csv for exibido em valor?

0

Suponha que meu arquivo csv contenha

"item_name","price","description"
mobile,500$,It has many features (e.g., camera, big display, etc)  

Eu quero carregar este arquivo de dados csv no banco de dados mysql usando o comando mysql como

load data local infile 'file.csv' into table table
 fields terminated by ','
 lines terminated by '\n'
 (column1, column2, column3,...)  

Você também pode dizer para usar o fechamento de cada valor por " e usar a opção enclosed by '"' do mysql. Mas encerrar cada valor é uma sobrecarga para mim.

Só posso incluir description value se houver uma solução para ler este tipo de csv, em que uma coluna está entre " , mas não todas.

    
por alhelal 30.03.2018 / 11:44

2 respostas

2

Altere o delimitador de campo de vírgulas para algo que não esteja presente no arquivo. Se você tiver controle sobre o que cria o arquivo CSV, isso não deve ser muito difícil.

Com csvkit , isso pode ser feito se o último campo for devidamente citado:

$ cat file.csv
"item_name","price","description"
mobile,500$,"It has many features (e.g., camera, big display, etc)"

$ csvformat -D@ file.csv
item_name@price@description
mobile@500$@It has many features (e.g., camera, big display, etc)

Ou, sem csvformat , assumindo que as duas primeiras vírgulas em cada linha são verdadeiros delimitadores:

$ sed -e 's/,/@/' -e 's/,/@/' file.csv

Isso não exige que o último campo seja citado.

Redirecione isso para um novo arquivo e use

load data local infile 'newfile.csv' into table table
 fields terminated by '@'
 lines terminated by '\n'
 (column1, column2, column3,...)  
    
por 30.03.2018 / 12:06
1

Eu diria que é um campo complexo e eu sou pessoalmente para codificá-los, por exemplo, em base64 ,

$ echo "It has many features (e.g., camera, big display, etc)"  | base64
SXQgaGFzIG1hbnkgZmVhdHVyZXMgKGUuZy4sIGNhbWVyYSwgYmlnIGRpc3BsYXksIGV0YykK

Mas, é claro, há prós e contras em fazer isso.

    
por 30.03.2018 / 12:37

Tags