Usar o ficheiro de dados de carga para enviar csv para a tabela mysql

Estou a usar o ficheiro de dados para carregar um .csv em uma mesa.

esta é a tabela que criei no meu db:

CREATE TABLE expenses (entry_id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entry_id), 
ss_id INT, user_id INT, cost FLOAT, context VARCHAR(100), date_created DATE);

Estes são alguns dos dados de amostra que estou a tentar enviar (algumas das linhas têm dados para cada coluna, algumas faltam a coluna Data):

1,1,20,Sandwiches after hike,
1,1,45,Dinner at Yama,
1,2,40,Dinner at Murphys,
1,1,40.81,Dinner at Yama,
1,2,1294.76,Flight to Taiwan,1/17/2011
1,2,118.78,Grand Hyatt @ Seoul,1/22/2011
1,1,268.12,Seoul cash withdrawal,1/8/2011

Aqui está o comando de dados de carga que não consigo trabalhar:

LOAD DATA INFILE '/tmp/expense_upload.csv'
INTO TABLE expenses (ss_id, user_id, cost, context, date)
;

este comando completa, envia o número correcto de linhas para a tabela, mas todos os campos são nulos. Sempre que tento adicionar campos Junto com',' ou linhas terminadas por '\r\n ' obtenho um erro de sintaxe.

outras coisas a notar: o csv foi criado no MS Excel.

Se alguém tem dicas ou pode me apontar na direção certa, seria muito apreciado!

Author: peterm, 2013-07-16

2 answers

Em primeiro lugar, eu mudaria FLOAT para DECIMAL para cost

CREATE TABLE expenses 
(
  entry_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  ss_id INT, 
  user_id INT, 
  cost DECIMAL(19,2), -- use DECIMAL instead of FLOAT
  context VARCHAR(100), 
  date_created DATE
);
Agora tenta isto.
LOAD DATA INFILE '/tmp/sampledata.csv' 
INTO TABLE expenses  
    FIELDS TERMINATED BY ',' 
           OPTIONALLY ENCLOSED BY '"'
    LINES  TERMINATED BY '\n' -- or \r\n
(ss_id, user_id, cost, context, @date_created)
SET date_created = IF(CHAR_LENGTH(TRIM(@date_created)) > 0, 
                      STR_TO_DATE(TRIM(@date_created), '%m/%d/%Y'), 
                      NULL);

O que é que o id faz:

  1. Ele usa sintaxe correta para especificar campos e Colunas terminadores
  2. dado que os seus valores de data no ficheiro não estão num formato adequado, ele lê primeiro um valor para uma variável de utilizador/sessão, depois, se não estiver vazia, converte-o para uma data, caso contrário atribui NULL. Este último impede que você tenha zero datas 0000-00-00.
 7
Author: peterm, 2017-06-16 14:46:36
Eis o meu conselho. Carregue os dados numa tabela de estadios onde todas as colunas são cadeias de caracteres e, em seguida, insira na tabela final. Isto permite-lhe verificar melhor os resultados ao longo do caminho:
CREATE TABLE expenses_staging (entry_id INT NOT NULL AUTO_INCREMENT,
                               PRIMARY KEY(entry_id), 
                               ss_id varchar(255),
                               user_id varchar(255),
                               cost varchar(255),
                               context VARCHAR(100),
                               date_created varchar(255)
                              );

LOAD DATA INFILE '/tmp/expense_upload.csv'
    INTO TABLE expenses_staging (ss_id, user_id, cost, context, date);
Isto vai deixar-te ver o que está realmente a ser carregado. Você pode então carregar esses dados na tabela final, fazendo quaisquer transformações de dados que sejam necessárias.
 0
Author: Gordon Linoff, 2013-07-16 01:47:08