LOAD DATA INFILE을 사용하여 CSV에서 MySQL 가져 오기 데이터


106

CSV 파일에서 20000 행의 일부 데이터를 Mysql로 ​​가져오고 있습니다.

CSV의 열은 MySQL 테이블의 열과 순서가 다릅니다. Mysql 테이블 열에 해당하는 열을 자동으로 할당하는 방법은 무엇입니까?

내가 실행할 때

LOAD DATA INFILE'abc.csv' INTO TABLE abc

이 쿼리는 모든 데이터를 첫 번째 열에 추가합니다.

데이터를 Mysql로 ​​가져 오기위한 자동 구문을 제안하십시오.



그것은 나에게 일어났다, 나는 텍스트 파일이 '\ r'로 끝나는 줄로 작성되었다는 것을 알았고 줄이 '\ n'을 사용하여
Tamer

2
Excel구문 생성 도구 와 함께 csv 데이터를 mysql로드하는 광범위한 자습서를 작성했습니다 . 독자들에게 유용 할 것입니다.
mysql_user

답변:


169

LOAD DATA INFILE 명령을 사용 하여 csv 파일을 테이블 로 가져올 수 있습니다 .

이 링크 MySQL-LOAD DATA INFILE을 확인하십시오 .

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

MySQL 8.0 사용자의 경우 :

LOCALhold security risk 키워드를 사용하면 MySQL 8.0부터 LOCAL기능이 False기본적으로 설정됩니다 . 오류가 표시 될 수 있습니다.

오류 1148 : 사용 된 명령은이 MySQL 버전에서 허용되지 않습니다.

문서지침에 따라 덮어 쓸 수 있습니다 . 이러한 덮어 쓰기는 보안 문제를 해결하는 것이 아니라 위험을 인식하고 기꺼이 감수 할 의사가 있음을 인정하는 것입니다.


1
IGNORE 1 LINES여기서 정확히 무엇을하는지 알 수 있을까요? 미리 감사드립니다.
Koushik Das

5
그것은 열 이름을 정의하는 첫 번째 줄 무시합니다 @KoushikDas
Saharsh 샤

28
주의 : LINES TERMINATED BY '\ r \ n'절은 Windows 파일에서 작동하지만 Linux 파일에는 '\ n'만 있어야합니다.
ChuckCottrill 2016-06-15

1
슬래시를 사용하는 것을 잊지 마십시오 : stackoverflow.com/a/42878067/470749
Ryan

3
(col1, col2, col3 ....)은 필요하지 않습니다. 이를 사용하여 데이터를 삽입하기 전에 즉시 테이블을 생성하는 경우 유용합니다.
Kieran Quinn

51

FIELDS TERMINATED BY ','구분 기호 를 설정해야 할 수도 있습니다.

CSV 파일의 경우 문은 다음과 같아야합니다.

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

1
LOAD DATA LOCAL INFILE ... LOCAL이 없으면 액세스가 거부되었습니다.
ketankk

49

파일을 가져 오기 전에 다음을 준비해야합니다.

  • 파일의 데이터를 가져올 데이터베이스 테이블입니다.
  • 테이블의 열 수 및 각 열의 데이터 유형과 일치하는 데이터가 포함 된 CSV 파일입니다.
  • MySQL 데이터베이스 서버에 연결하는 계정에는 FILE 및 INSERT 권한이 있습니다.

다음 테이블이 있다고 가정합니다.

여기에 이미지 설명 입력

다음 쿼리를 사용하여 테이블 만들기 :

CREATE TABLE IF NOT EXISTS `survey` (
  `projectId` bigint(20) NOT NULL,
  `surveyId` bigint(20) NOT NULL,
  `views` bigint(20) NOT NULL,
  `dateTime` datetime NOT NULL
);

CSV 파일의 형식은 다음과 같이 첨부 된 이미지의 예를 참조하십시오.

여기에 이미지 설명 입력

모든 것이 정상이라면 .. CSV 파일에서 데이터를로드하려면 다음 쿼리를 실행하십시오.

참고 : CSV 파일의 절대 경로를 추가하십시오.

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

모든 것이 완료 되었다면. CSV에서 테이블로 데이터를 성공적으로 내보냈습니다.


기본적으로 잘못된 데이터 유형을 무시하기 때문에 CSV 파일에 각 열에 대해 적절한 데이터 유형이 있는지 어떻게 확인할 수 있습니까?
Umar Abbas

2
그런 오래된 답변을 방해해서 죄송합니다. 매우 설득력이 있지만 어떻게 필드를 건너 뛸 수 있습니까? 내 테이블에 projectId, surveyId 및 dateTime이 있다고 가정 해 보겠습니다. "views"필드를 어떻게 건너 뛸 수 있습니까?
덴마크 Ansari

@MD Danish Ansari, 이전 질문에 답해 드려 죄송합니다. 테이블 열을 지정할 수 있습니다. 첫 번째 필드 (자동 증가 기본 키)와 몇 가지 다른 필드를 건너 뛰어야하는 다음을 수행했습니다 .LOAD DATA LOCAL INFILE 'C : \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'INTO TABLE my_log_tbl FIELDS TERMINATED BY', 'ENCLOSED BY' " 'LINES TERMINATED BY'\ r \ n '(UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); 열은 다음에 와야한다고 생각했습니다. 테이블 이름이지만 작동하지 않았습니다. 마지막에 표시되어야합니다.
kalinma

17

통사론:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name' INTO TABLE `tbl_name`
CHARACTER SET [CHARACTER SET charset_name]
FIELDS [{FIELDS | COLUMNS}[TERMINATED BY 'string']] 
[LINES[TERMINATED BY 'string']] 
[IGNORE number {LINES | ROWS}]

이 예를 참조하십시오.

LOAD DATA LOCAL INFILE
'E:\\wamp\\tmp\\customer.csv' INTO TABLE `customer`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

10

데이터베이스에 1 분 안에 7000000 개 이상의 레코드를 대량으로 삽입 (계산을 통한 초고속 질의)

mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ');
$affected = (int) (mysqli_affected_rows($cons))-1; 
$log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP 및 RRP_nl 및 RRP_bl은 csv에 없지만이를 계산하고 삽입 한 후에 계산합니다.


2

LOAD DATA LOCAL INFILEWindows 셸에서 실행 중이고 를 사용해야하는 OPTIONALLY ENCLOSED BY '"'경우 문자를 제대로 이스케이프하려면 다음과 같이해야합니다.

"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql" -u root --password=%password% -e "LOAD DATA LOCAL INFILE '!file!' INTO TABLE !table! FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"^""' LINES TERMINATED BY '\n' IGNORE 1 LINES" --verbose --show-warnings > mysql_!fname!.out

2

xampp 및 phpmyadmin을 사용하고 있다고 가정 해 보겠습니다.

파일 이름은 'ratings.txt'테이블 이름은 'ratings'이고 데이터베이스 이름은 'movies'입니다.

xampp가 "C : \ xampp \"에 설치된 경우

"C : \ xampp \ mysql \ data \ movies"폴더에 "ratings.txt"파일을 복사하십시오.

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

localhost에서 수행하는 경우 오류를 생략하는 데 도움이되기를 바랍니다.


0

csv 또는 텍스트 파일에서 데이터를로드 할 수 있습니다. 테이블의 레코드가있는 텍스트 파일이있는 경우 테이블 내에서 해당 레코드를로드 할 수 있습니다. 예를 들어 각 행이 각 열의 값이있는 레코드 인 텍스트 파일이있는 경우이 방법으로 레코드를로드 할 수 있습니다.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

--Windows의 예

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 

0

오류 코드 : 1290이 발생했습니다. MySQL 서버가 --secure-file-priv 옵션으로 실행 중이므로이 문을 실행할 수 없습니다.

이것은 wampserver 3.0.6 64bit를 사용하는 Windows 8.1 64 비트에서 저에게 효과적이었습니다.

C : \ wamp64 \ bin \ mysql \ mysql5.7.14에서 my.ini 파일을 편집했습니다.

secure_file_priv c : \ wamp64 \ tmp \ 항목 삭제 (또는 여기에있는 디렉토리)

모든 것을 중지하고-exit wamp 등-모든 것을 다시 시작했습니다. 그런 다음 C : \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur에서 내 cvs 파일을 펀트합니다 (마지막 디렉토리는 내 데이터베이스 이름 임).

LOAD DATA INFILE 'myfile.csv'실행

INTO TABLE 졸업생

','로 끝나는 필드

' "'로 묶임

'\ r \ n'에 의해 종료 된 줄

한 줄 무시

... 그리고 VOILA !!!


0

다음과 같이 삽입 할 수 있습니다.

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.