2013-07-16 3 views
4

LOAD DATA INFILE을 사용하여 .csv를 테이블에 업로드하고 있습니다. LOAD DATA INFILE을 사용하여 csv를 mysql 테이블에 업로드

내가 내 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); 

이 내가 (행 중 일부는 모든 열에 대한 데이터를 업로드하기 위해 노력하고있어 샘플 데이터의 일부이며, 일부는 누락 날짜 열) :

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

: 여기

 
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 

내가 얻을 수없는 LOAD DATA 명령이 작동하는 것입니다 이 명령이 완료되면 올 Y 른 행 수를 테이블에 업로드하지만 모든 필드는 널 (NULL)입니다. 언제든지 ','또는 '\ r \ n'에 의해 종료 된 줄을 추가하려고 할 때 구문 오류가 발생합니다.

기타주의 사항 : csv는 MS Excel로 작성되었습니다.

누군가가 팁을 갖고 있거나 올바른 방향으로 나를 가리킬 수 있다면 많은 도움이 될 것입니다.

답변

7

우선이

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); 

어떤 ID가 수행하려고 지금 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 
); 

에 대한 DECIMALFLOAT을 변경 것 :이 필드를 지정하기위한 올바른 구문을 사용

  1. 및 열 종결 자
  2. 파일의 날짜 값이 올바른 형식이 아니기 때문에 먼저 사용자/세션 변수에 값을 읽은 다음 비어 있지 않으면 날짜로 변환하고, 그렇지 않으면 NULL을 할당합니다. 후자는 날짜가 0이되지 않도록합니다 0000-00-00.
+0

돈 값은 항상'DECIMAL'을 사용하십시오. 항상. – Mindwin

0

여기 내 조언입니다. 모든 컬럼이. 자열 인 스테이징 테이블로 데이터를로드 한 후 최종 테이블에 삽입하십시오. 이렇게하면 길을 따라 더 나은 결과를 확인할 수 있습니다.

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); 

이렇게하면 실제로로드되는 내용을 볼 수 있습니다. 그런 다음 필요한 데이터 변환을 수행하여이 데이터를 최종 테이블에로드 할 수 있습니다. 모든

+0

불행히도 50 행마다 약 1 개를 가져오고 나머지는 NULL입니다. 왜이게 될거야? –