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


306

제정신 형식으로 리팩터링 할 수 있도록 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레코드 가 많이 있으며 로드 된 데이터가 올바른 위치에없는 것 같습니다.


17
그리고 OSX를 사용하고 있다면 Sequel Pro 에는 멋진 가져 오기 도구가 있으며 무료입니다. ;-)
Merrick

41
원래 포스터가 다른 사람보다 자신의 질문에 더 잘 대답했다는 것이 놀랍습니다 ... 기존 SQL 명령이있을 때 너무 많은 사람들이 소프트웨어 권장 사항을 제공 할 준비가 된 이유를 모르겠습니다 .UI보다는 프로그래밍 방식 일 수 있습니다 기반. 다른 사람은 모르지만 프로그래밍 방식은 타임 스탬프에서 파일을 자동 가져 오기하도록 스크립트를 설정할 수 있다는 것을 의미하지만 UI 기반은 순전히 수동입니다.
Chris Cirefice

@ChrisCirefice : 나는 받아 들인 대답이 그것을 잘 설명한다고 생각합니다. 그는 그래픽 프로그램이 도울 수있는 'load data'명령을 수동으로 작성하는 데 도움이 필요했습니다. 그래픽 프로그램이 '데이터로드'명령을 작성하면 프로그래밍 방식으로 재사용 할 수 있습니다.
AlexC

이 OSX에 대접했다 @Merrick
weaveoftheride

Excel에서 구문 생성기 도구 와 함께 CSV로 데이터를 mysql로드하는 광범위한 자습서를 작성했습니다 .
mysql_user

답변:


133

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

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

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

텍스트 파일 가져 오기

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

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

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


25
Mac OSX의 경우 Sequel Pro를 사용하십시오.
Agi Hammerthief

3
방금 시도했지만 열 이름 대신 테이블을 먼저 만들어야합니다.
도미니크

3
계속하기 전에 테이블을 선택해야합니다. 그리고 요점은 테이블을 만들 필요가 없기 때문에 ...
Dominique

3
Linux에서 HeidiSQL은 Wine에서 매우 잘 작동합니다.
AlejandroVD

1
매우 @ 폴 대답의 그 GUI 도구는 테이블 컬럼 쉽게에 일치 가져 오기 열을 만들 수 있습니다.
Pekka

191

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'


6
mysqlimportLOAD DATA INFILE...무대 뒤에서 사용 하므로 거의 똑같습니다.
Mladen Jablanović '12

8
에서와 마찬가지로 LOAD DATA INFILE사용하기 전에 테이블을 만들어야합니다 mysqlimport.
Marcus Downing

@ MladenJablanović, 그것은 확실히 같은 것이 아닙니다. 1bil 행을 가져 오십시오. 성능면에서 큰 차이가있는 것에 놀랄 것입니다
ninjabber

@ninjabber 문서에 따르면 mysqlimport 클라이언트는 LOAD DATA INFILE에 명령 행 인터페이스 를 제공 하므로 이론적으로 성능상의 이점을 제공하는 것은 불가능하다 LOAD DATA INFILE.
Mladen Jablanović

1
또한 필요 --fields-optionally-enclosed-by=\"하고`--fields-escaped-by = \`
chaintng

80

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

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


1
','-> '\ t', '' '->' 'TSV 파일의 경우 마지막 줄을 제거, 헤더 (희망 검색 크롤러 색인이)합니다..
손가락 출혈

16
로컬 파일 인 경우해야 할 수도 있습니다 LOAD DATA LOCAL INFILE. 이 오류 1148 "사용 된 명령이 허용되지 않습니다"가 발생하면 명령 행에서 mysql을 실행하여 오류 1148을 활성화 할 수 있습니다 --local-infile.
Big McLargeHuge

오류가 발생했습니다 : 오류 1045 (28000) : 사용자 'user'@ '%'에 대한 액세스가 거부되었습니다 (암호 사용 : YES)
ARUNBALAN NV

관리자 패널에서 사용자에게 모든 액세스 권한을 부여한 다음 스크립트를 가져 오십시오.
DareDevil

1
이 오류가 발생합니다. MySQL 서버가 --secure-file-priv 옵션으로 실행
중이므로이

66

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

이 방법을 사용하여 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);

16k 개의 행과 48 개의 열을 가져 왔습니다. 고마워 친구
Renjith VR

이것이 가장 좋은 해결책입니다. 이것이 얼마나 빠른지 궁금한 사람은 : 온보드 MySQL 서버 (고성능 RDS가 아님)로 $ 20 / mo AWS Lightsail 인스턴스에서 14 초 내에 320 만 행을 가져 왔습니다. 대박!
master_gracey

이 줄 (field_1,field_2 , field_3);에서 .csv 파일 또는 테이블의 열 목록을 참조합니까? 즉,이 필드들은 무엇입니까?
tera_789

@ tera_789 csv 파일에서 아마도 당신의 테이블과 일치 할 것입니다
Fahad

데이터 형식을 따라야합니다. 예 (내 경우) <pre> first_name, last_name, dob, phone_number, email, name, lastName, 12-05-2018,54545, faiz @ gmail.com, name1, lastName1,2018-05-12,456, faiz1 @ gmail .com, name2, lastName2,2018-05-12,456, faiz2 @ gmail.com, name3, lastName3,2018-05-22,456, faiz3 @ gmail.com, name4, lastName4,1988-05-22,456, faiz4 @ gmail.com , name5, lastName5,1988-05-22,456, faiz5 @ gmail.com, name6, lastName6,1987-05-21,456, faiz6 @ gmail.com </ pre>
Faiz Ahmed

32

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

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

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

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

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

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

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

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

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

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

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

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


이것은 좋고 간단합니다. SQL을 통해 테이블과 열을 만들고 (9 단계를 건너 뛰고) CSV 가져 오기를 통해 데이터를 삽입하는 것을 선호합니다. NULL자동 증분 필드 / 열에 대해 CSV에서 설정하는 것을 잊지 마십시오 .
은빛

Cyrillic 문자가 CSV 파일에 포함되어 있으면 utf-8을 사용하도록 지시하더라도 phpMyAdmin이 비참하게 실패합니다.
Fran Marzoa

큰 CSV 파일을 가져 오는 경우 가져 오기 크기를 변경하는 것을 잊지 마십시오. BTW는 큰 CSV 파일에는 적합하지 않습니다.
Avi

로컬 csv 파일을 찾아 볼 수 없으므로 먼저 .csv 파일을 웹 클라이언트로 다운로드해야합니다.
mckenzm

예, '로컬 키워드'라고 표시된 확인란을 선택해야하며 로컬 csv 파일
chrisfs를

12

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

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

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


8

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

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

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


이것이 가장 좋은 대답입니다. 단일 SQL 명령으로 다른 도구를 사용하는 이유 는 무엇입니까?
sdgfsdh

서버에서 실행중인 mysql에 파일을로드하려고 할 때이 작업을 수행하는 방법을 알고 있습니까? 파일 (암호)에 대한 액세스 거부를 요청합니다. CSV 파일 위치의 비밀번호는 어디에 입력합니까?
Baktaawar

7

mysql 명령 행은 가져올 때 너무 많은 문제가 발생하기 쉽다. 방법은 다음과 같습니다.

  • 공백을 사용하지 않도록 Excel을 사용하여 헤더 이름을 편집하십시오.
  • .csv로 저장
  • 무료 Navicat Lite Sql Browser를 사용하여 새 테이블을 가져오고 자동 생성 (이름 제공)
  • 새 테이블을 열고 ID의 기본 자동 번호 열을 삽입하십시오.
  • 원하는대로 열 유형을 변경하십시오.
  • 끝난!

5

MySQL Workbench (현재 6.3 버전)를 사용하는 경우 다음을 수행하면됩니다.

  1. "테이블"을 마우스 오른쪽 버튼으로 클릭하십시오.
  2. 테이블 데이터 가져 오기 마법사 선택;
  3. csv 파일을 선택하고 지시 사항을 따르십시오 (JSON도 사용 가능). 좋은 점은 기존 테이블로 데이터를 가져 오거나로드하려는 csv 파일을 기반으로 새 테이블을 만들 수 있다는 것입니다

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


+1. MySQL은 나에게 오류를주는 유지하기 때문에 나는 이것을 사용 LOAD DATA INFILE하고 mysqlimport( "이이 버전의 MySQL이 지원되지 않습니다")
clmno

이 방법은 효과가 있지만 느립니다. 이 기능을 사용하면 대규모 INSERT쿼리 가 작성 되어 한 번에 모두 시도했지만 실제로는 INSERT행당 한 번 실행되는 것처럼 보입니다 .
DaveTheMinion

4

뭔가 이상한 것이 보입니다. 엔 클로징에 사용하는 것과 동일한 문자를 이스케이프 처리하는 데 사용하고 있습니다. 따라서 엔진은 ' "'를 발견했을 때 무엇을해야하는지 알지 못하기 때문에 올바른 위치에 아무것도없는 것 같습니다. 이스케이프 라인을 제거하면 제대로 작동해야한다고 생각합니다.

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

CSV를 분석 (수동으로, 시각적으로 ...)하지 않고 이스케이프에 사용하는 문자를 찾지 않으면 때로는 '\'입니다. 그러나 가지고 있지 않으면 사용하지 마십시오.


3

또 다른 해결책은 놀라운 csvkit 제품군의 csvsql 도구 를 사용 하는 것 입니다.

사용 예 :

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

이 도구는 자동으로 데이터 유형을 유추하고 (기본 동작) 테이블을 생성하고 생성 된 테이블에 데이터를 삽입 할 수 있습니다. --overwrite옵션이 이미 존재하는 경우 테이블을 삭제하는 데 사용할 수 있습니다.--insert옵션 — 파일에서 테이블을 채 웁니다.

제품군을 설치하려면

pip install csvkit

전제 조건 : python-dev , libmysqlclient-dev,MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python

3

CSV 파일을 SQL 테이블로 가져 오는 방법

예 파일 : Overseas_trade_indexdata CSV File

단계 :

  1. 에 대한 테이블을 만들어야합니다 overseas_trade_index.

  2. CSV 파일과 관련된 열을 만들어야합니다.

    SQL 쿼리 :

    ( id int not null primary key auto_increment,
    series_reference varchar (60),
    period varchar (60),
    data_value decimal(60,0),
    status varchar (60),
    units varchar (60),
    magnitude int(60),
    subject text(60),
    group text(60),
    series_title_1 varchar (60),
    series_title_2 varchar (60),
    series_title_3 varchar (60),
    series_title_4 varchar (60),
    series_title_5 varchar (60),
     );
  3. 터미널에서 mysql 데이터베이스를 연결해야합니다.

    =>show databases;
    =>use database;
    =>show tables;
  4. csv 데이터를 mysql 테이블로 가져 오려면이 명령을 입력하십시오.

    load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);
  5. sqldatabase에서이 해외 무역 지수 데이터를 찾으십시오.

    select * from trade_index;

2

Excel 스프레드 시트가로드 된 Windows 시스템을 사용하는 경우 Excel에 대한 새로운 mySql 플러그인은 놀랍습니다. 오라클 직원들은 실제로 그 소프트웨어에서 훌륭한 일을했습니다. Excel에서 직접 데이터베이스를 연결할 수 있습니다. 이 플러그인은 데이터를 분석하고 데이터와 일치하는 형식으로 테이블을 설정합니다. 나는 변환 할 괴물의 큰 CSV 파일을 가지고있었습니다. 이 도구는 시간을 크게 절약했습니다.

http://dev.mysql.com/downloads/windows/excel/

온라인으로 데이터베이스에 채워질 Excel 내에서 업데이트 할 수 있습니다. 이는 매우 저렴한 GoDaddy 공유 호스팅에서 생성 된 mySql 파일에서 매우 잘 작동했습니다. (GoDaddy에서 테이블을 생성 할 때 데이터베이스의 사이트 외부 액세스를 가능하게하려면 일부 비표준 설정을 선택해야합니다 ...)

이 플러그인을 사용하면 XL 스프레드 시트와 온라인 mySql 데이터 스토리지간에 완벽한 상호 작용이 가능합니다.


2

mysql workbench를 사용하여 동일한 작업을 수행합니다.

  1. 새로운 스키마 생성
  2. 새로 생성 된 스키마 열기
  3. "테이블"을 마우스 오른쪽 버튼으로 클릭하고 "테이블 데이터 가져 오기 마법사"를 선택하십시오.
  4. csv 파일 경로 및 테이블 이름을 지정하고 마법사가 값에 따라 기본 열 유형을 설정하므로 열 유형을 구성하십시오.

참고 : "tail -f [mysqlworkbenchpath] /log/wb*.log"를 사용하여 오류에 대한 mysql workbench의 로그 파일을 살펴보십시오.


MySQL에 익숙하지 않은 귀하의 답변에 대해 대단히 감사합니다. CSV에 대해 도움이되었습니다. 이제 Access에서 10 개의 테이블을 가져와야합니다. 가장 간단한 방법은 이러한 테이블을 Excel, Excel에서 CSV로 내 보낸 다음이 단계를 사용하는 것입니까?
나오미

나는이 방법은 모든 행 :( 아웃 그것은 단지 나를 위해 2,485 행을 수입 5,342 행의를 가져 오지 않는 것으로 확인 왜 그.?
나오미

Naomi, mysqlworkbench 로그를 확인하면 데이터 가져 오기가 중지 된 이유가 표시됩니다. DB 및 CSV 파일에 일부 null 값 또는 불일치 유형이있을 수 있습니다. 그러나 Juan의 대답을 따르는 것이 좋습니다. 그의 해결책은 나보다 낫고 깨끗합니다.
Mehdi

1

다음은 샘플 Excel 파일 스크린 샷입니다.

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

다른 이름으로 저장하고 .csv를 선택하십시오.

notepad ++ 또는 다른 메모장을 사용하여 열면 아래와 같이 .csv 데이터 스크린 샷이 표시됩니다.

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

mysql Table에서와 같이 헤더를 제거하고 .csv에 열 정렬이 있는지 확인하십시오. folder_name을 폴더 이름으로 바꾸십시오.

DATA LOCAL INFILE
'D : /folder_name/myfilename.csv'를 ','(fname, lname, email, phone)로 종료 된 테이블 메일 필드에로드

빅 데이터 인 경우 커피를 가져 와서로드 할 수 있습니다!.

그게 당신이 필요한 전부입니다.



0

CSV 파일을 MySQL 데이터베이스로 가져 오기위한 PHP 쿼리

$query = <<<EOF
            LOAD DATA LOCAL INFILE '$file'
             INTO TABLE users
             FIELDS TERMINATED BY ','
             LINES TERMINATED BY '\n'
             IGNORE 1 LINES
            (name,mobile,email)
    EOF;
if (!$result = mysqli_query($this->db, $query))
   {
        exit(mysqli_error($this->db));
   }

** 샘플 CSV 파일 데이터 **

name,mobile,email
Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus

0

서버 이름, 사용자 이름, 비밀번호, dbname, 파일 경로, 테이블 이름 및 삽입하려는 데이터베이스에있는 필드를 변경하십시오.

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "bd_dashboard";
    //For create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    $query = "LOAD DATA LOCAL INFILE 
                'C:/Users/lenovo/Desktop/my_data.csv'
                INTO TABLE test_tab
                FIELDS TERMINATED BY ','
                LINES TERMINATED BY '\n'
                IGNORE 1 LINES
                (name,mob)";
    if (!$result = mysqli_query($conn, $query)){
        echo '<script>alert("Oops... Some Error occured.");</script>';
        exit();
            //exit(mysqli_error());
       }else{
        echo '<script>alert("Data Inserted Successfully.");</script>'
       }
    ?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.