[mysql] CSV 파일을 MySQL 테이블로 가져 오려면 어떻게합니까?

제정신 형식으로 리팩터링 할 수 있도록 MySQL 테이블에로드하려고하는 클라이언트의 표준화되지 않은 이벤트 일기 CSV가 있습니다. CSV 파일의 모든 열에 대해 하나의 필드가있는 ‘CSVImport’라는 테이블을 만들었습니다. CSV에는 99 개의 열이 포함되어 있으므로 그 자체로는 어려운 작업이었습니다.

CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);

테이블에 제한 조건이 없으며 모든 필드는 카운트 (INT로 표시됨), 예 / 아니오 (BIT로 표시됨), 가격 (DECIMAL로 표시됨) 및 텍스트 흐림 ( TEXT로 표시).

파일에 데이터를로드하려고했습니다.

LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
SELECT * FROM CSVImport;
| NULL             | NULL        | NULL           | NULL | NULL               |
...

전체 테이블이로 채워집니다 NULL.

문제는 텍스트 흐림 효과에 두 줄 이상이 포함되어 있으며 MySQL은 각 새 줄이 하나의 databazse 행에 해당하는 것처럼 파일을 구문 분석하는 것입니다. 문제없이 파일을 OpenOffice에로드 할 수 있습니다.

clientdata.csv 파일은 2593 행과 570 개의 레코드를 포함합니다. 첫 번째 줄에는 열 이름이 있습니다. 쉼표로 구분되고 텍스트는 큰 따옴표로 구분됩니다.

최신 정보:

확실하지 않은 경우 다음 설명서를 읽으십시오. http://dev.mysql.com/doc/refman/5.0/en/load-data.html

LOAD DATAOpenOffice가 유추하기에 충분히 똑똑하다는 진술 에 몇 가지 정보를 추가 했으며 이제 올바른 수의 레코드를로드합니다.

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

그러나 여전히 완전한 NULL레코드 가 많이 있으며 로드 된 데이터가 올바른 위치에없는 것 같습니다.



답변

문제의 핵심은 CSV 파일의 열과 테이블의 열을 일치시키는 것으로 보입니다.

많은 그래픽 mySQL 클라이언트에는 이런 종류의 가져 오기 대화 상자가 있습니다.

내가 가장 좋아하는 작업은 Windows 기반 HeidiSQL 입니다. LOAD DATA명령 을 빌드하기위한 그래픽 인터페이스를 제공합니다 . 나중에 프로그래밍 방식으로 재사용 할 수 있습니다.

텍스트 파일 가져 오기

스크린 샷 : “텍스트 파일 가져 오기”대화 상자

텍스트 파일 가져 오기 “대화 상자를 열려면 Tools > Import CSV file .

여기에 이미지 설명을 입력하십시오


답변

mysqlimport 를 사용 하여 데이터베이스에 테이블을로드 하십시오 .

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv

나는 그것을 http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/ 에서 찾았다 .

구분 기호를 탭으로 만들려면 --fields-terminated-by='\t'


답변

200 + 행을 가져온 가장 간단한 방법은 phpmyadmin sql 창에서 명령 아래에 있습니다.

CountryId, CountryName이라는 두 개의 열이있는 간단한 국가 테이블이 있습니다.

여기 .csv 데이터가 있습니다CSV 파일

여기 명령이 있습니다 :

LOAD DATA INFILE 'c:/country.csv'
INTO TABLE country
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

한 번만 명심하고 두 번째 열에는 표시하지 마십시오. 그렇지 않으면 가져 오기가 중지됩니다.


답변

나는 알고 문제는 오래된 , 그러나 나는 싶습니다 공유

이 방법을 사용하여 100K가 넘는 레코드를 가져 왔습니다 ( 하여 0.046 초 내에 ~ 5MB )

방법은 다음과 같습니다.

LOAD DATA LOCAL INFILE
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

마지막 줄을 포함시키는 것이 매우 중요합니다. 하나 이상의 필드가있는 경우, 즉 일반적으로 마지막 필드를 건너 뜁니다 (MySQL 5.6.17)

LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

그런 다음 제목으로 첫 번째 행 이 있다고 가정합니다. 필드 포함 할 수 있습니다

IGNORE 1 ROWS

파일에 헤더 행이있는 경우의 모습입니다.

LOAD DATA LOCAL INFILE
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);


답변

phpMyAdmin 은 CSV 가져 오기를 처리 할 수 ​​있습니다. 단계는 다음과 같습니다.

  1. MySQL 테이블 필드와 동일한 순서로 필드를 갖도록 CSV 파일을 준비하십시오.

  2. 데이터 만 파일에 있도록 CSV에서 헤더 행을 제거하십시오 (있는 경우).

  3. phpMyAdmin 인터페이스로 이동하십시오.

  4. 왼쪽 메뉴에서 표를 선택하십시오.

  5. 상단의 가져 오기 버튼을 클릭하십시오.

  6. CSV 파일을 찾아보십시오.

  7. “LOAD DATA를 사용하는 CSV”옵션을 선택하십시오.

  8. “다음으로 종료 된 필드”에 “,”를 입력하십시오.

  9. 데이터베이스 테이블에서와 동일한 순서로 열 이름을 입력하십시오.

  10. 이동 버튼을 클릭하면 완료됩니다.

이것은 나중에 사용할 수 있도록 준비했으며 다른 사람이 혜택을 볼 수있는 경우 여기에서 공유합니다.


답변

LOAD DATA 문에 열을 나열하여이 문제를 해결할 수 있습니다. 로부터 수동 :

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

… 귀하의 경우 99 열을 csv 파일에 나타나는 순서대로 나열해야합니다.


답변

이것을 시도, 그것은 나를 위해 일했다

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

IGNORE 1 ROWS는 여기서 필드 이름을 포함하는 첫 번째 행을 무시합니다. 파일 이름의 경우 파일의 절대 경로를 입력해야합니다.