MySQL 테이블로 CSV 가져 오기


96

csv 파일을 mysql 테이블에 업로드하는 가장 좋은 / 가장 빠른 방법은 무엇입니까? 데이터의 첫 번째 행을 열 이름으로 사용하고 싶습니다.

발견 :

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

그러나 유일한 대답은 셸이 아닌 GUI를 사용하는 것이 었습니까?


3
GUI 솔루션조차도 CSV에서 열 이름을 가져 오지 않습니다. 가져 오기 전에 전체 테이블을 만들어야합니다.
Dominique 2014

질문은 이미 여기에 답이 있습니다. stackoverflow.com/questions/3635166/…
David

연결하려는 질문에 대한 대답은 GUI를 사용하는 것입니다. 이 질문 (답변)은 2012 년의 질문 인 반면 당신이 참고하는 대답은 어제 제공되었습니다.
lcm

답변:


147

CSV 파일에서 정보를 가져 오는 스크립트를 작성하는 대신 MYSQL을 여기에 직접 연결하고 다음 SQL 구문을 사용하여 정보를 업로드 할 수 있습니다.

Excel 파일을 MySQL로 가져 오려면 먼저 CSV 파일로 내보내십시오. Excel에서 CSV 파일 끝에 넣었을 수있는 빈 데이터와 함께 생성 된 CSV 파일에서 CSV 헤더를 제거합니다.

그런 다음 다음을 실행하여 MySQL 테이블로 가져올 수 있습니다.

load data local infile 'uniq.csv' into table tblUniq fields terminated by ','
  enclosed by '"'
  lines terminated by '\n'
    (uniqName, uniqCity, uniqComments)

읽어보기 : CSV 파일을 MySQL로 직접 가져 오기

편집하다

귀하의 경우에는 첫 번째 행을 찾고 열 이름으로 할당하기 위해 먼저 인터프리터를 작성해야합니다.


편집 -2

구문 에 대한LOAD DATA MySQL 문서 에서 :

IGNORE number LINES옵션을 사용하여 파일 시작 부분의 행을 무시할 수 있습니다. 예를 들어를 사용 IGNORE 1 LINES하여 열 이름이 포함 된 초기 헤더 행을 건너 뛸 수 있습니다 .

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

따라서 다음 문을 사용할 수 있습니다.

LOAD DATA LOCAL INFILE 'uniq.csv'
INTO TABLE tblUniq
FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(uniqName, uniqCity, uniqComments)

8
첫 번째 줄을 제거하는 대신 IGNORE 1 LINES쿼리에 추가 할 수 있습니다.
mb14

파일 경로를 csv 파일로 설정하는 방법이 있는지 알고 있습니까?
JasonDavis

실패 할 때이 명령을 디버그하는 방법은 무엇입니까? 이 명령으로 파일을로드하려고하는데 아무것도하지 않습니다.

csv의 열을 무시하려면 어떻게해야합니까?
Marci-man

내 CSV 로컬 파일에 대한 권한을 부여하는 방법 MySQL 서버 AWS에서 실행 (RDS)에 액세스 할 수 있습니다
라훌

24

다음은 필요한 작업을 수행하는 간단한 PHP 명령 줄 스크립트입니다.

<?php

$host = 'localhost';
$user = 'root';
$pass = '';
$database = 'database';

$db = mysql_connect($host, $user, $pass);
mysql_query("use $database", $db);

/********************************************************************************/
// Parameters: filename.csv table_name

$argv = $_SERVER[argv];

if($argv[1]) { $file = $argv[1]; }
else {
    echo "Please provide a file name\n"; exit; 
}
if($argv[2]) { $table = $argv[2]; }
else {
    $table = pathinfo($file);
    $table = $table['filename'];
}

/********************************************************************************/
// Get the first row to create the column headings

$fp = fopen($file, 'r');
$frow = fgetcsv($fp);

foreach($frow as $column) {
    if($columns) $columns .= ', ';
    $columns .= "`$column` varchar(250)";
}

$create = "create table if not exists $table ($columns);";
mysql_query($create, $db);

/********************************************************************************/
// Import the data into the newly created table.

$file = $_SERVER['PWD'].'/'.$file;
$q = "load data infile '$file' into table $table fields terminated by ',' ignore 1 lines";
mysql_query($q, $db);

?>

첫 번째 행을 기반으로 테이블을 만들고 나머지 행을 가져옵니다. 다음은 명령 줄 구문입니다.

php csv_import.php csv_file.csv table_name

2
멋진 스크립트. 에 이중 인용 CSV 파일이있는 사람들을 위해`쌌다 IN을 '\ "' '추가 (대부분의 사람들 읽기) fields terminated by ','그것도 부분적으로 이중 인용 CSV를 함께 작동 ....
조엘 멜론

3
내 생각에는 ENCLOSED BY '\"'... 또한 LINES TERMINATED BY '\r\n'Windows에서 CSV를 사용하는 경우 많은 사람들이 필요 합니다. 마지막으로 공백이있는 경우 백틱으로 필드 이름을 이스케이프하는 것이 현명합니다.$columns .= "`$column` varchar(250)";
dlo

1
이 대답은 받아 들여진 대답보다 훨씬 낫습니다. 특히 그것은 OP가 요구 한 것을 허용하고, 또한 "데이터의 첫 번째 행이 열 이름으로 사용됨"을 원합니다. (파이썬 스크립트를 선호하므로 PHP를 설치할 필요는 없지만 포팅하기 어렵지 않습니다.)
LarsH

2
@YumYumYum 현재 겪고있는 문제에 대해 자세히 설명해 주시겠습니까?
Hawkee

맥주 사 줄까?
Joe

4

phpadmin을 설치할 수있는 기능이있는 경우 CSV 파일을 데이터베이스로 가져올 수있는 가져 오기 섹션이 있습니다. 헤더를 파일의 첫 번째 줄에 테이블 열 이름이 포함되도록 설정하는 확인란도 있습니다 (선택하지 않은 경우 첫 번째 줄은 데이터의 일부가됩니다.


난 정말 당신이 기능을 얻기 위해 추가 기능 phpadmin 등을 사용할 필요가 있음을 놀라게하고, 답변 주셔서 감사합니다
chrisfs

이것은 방금 내 하루를 만들었습니다
Mark

4

먼저 csv 파일에있는 동일한 수의 열을 사용하여 데이터베이스에 테이블을 만듭니다.

그런 다음 다음 쿼리를 사용하십시오.

LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'

csv의 열을 무시하려면 어떻게해야합니까?
Marci-man

3

텍스트 파일 또는 csv 파일에서 데이터를로드하려면 명령은 다음과 같습니다.

load data local infile 'file-name.csv'
into table table-name
fields terminated by '' enclosed by '' lines terminated by '\n' (column-name);

위의 명령에서, 제 경우에는로드 할 열이 하나뿐이므로 "종료"및 "둘러싸인"이 없으므로이를 비워 두었습니다. 그렇지 않으면 프로그래머가 분리 문자를 입력 할 수 있습니다. 예를 들어. , (쉼표) 또는 "또는; 또는 모든 것.

** mysql 버전 5 이상을 사용하는 사용자 **

파일을 mysql에로드하기 전에 아래 견인 줄이 옆에 추가되었는지 확인해야합니다. etc/mysql/my.cnf

my.cnf 명령을 편집하려면

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  


2

이 작업을 수행하기 위해 몇 가지 코드를 작성했습니다. 몇 가지 스 니펫을 넣겠습니다.

$dir = getcwd(); // Get current working directory where this .php script lives
$fileList = scandir($dir); // scan the directory where this .php lives and make array of file names

그런 다음 CSV 헤더를 가져와 mysql에 가져 오는 방법을 알릴 수 있습니다 (참고 : mysql 열이 csv 열과 정확히 일치하는지 확인).

//extract headers from .csv for use in import command
$headers = str_replace("\"", "`", array_shift(file($path)));
$headers = str_replace("\n", "", $headers);

그런 다음 쿼리를 mysql 서버로 보냅니다.

mysqli_query($cons, '
        LOAD DATA LOCAL INFILE "'.$path.'"
            INTO TABLE '.$dbTable.'  
            FIELDS TERMINATED by \',\' ENCLOSED BY \'"\'
            LINES TERMINATED BY \'\n\'
            IGNORE 1 LINES
            ('.$headers.')
            ;
        ')or die(mysql_error());

1

나는 이것과 얼마 동안 씨름했다. 문제는 데이터를로드하는 방법이 아니라 데이터를 저장할 테이블을 구성하는 방법에 있습니다. 데이터를 가져 오기 전에 테이블을 빌드하려면 DDL 문을 생성해야합니다.

테이블에 많은 수의 열이있는 경우 특히 어렵습니다.

다음은 (거의) 작업을 수행하는 Python 스크립트입니다.

#!/usr/bin/python    
import sys
import csv

# get file name (and hence table name) from command line
# exit with usage if no suitable argument   
if len(sys.argv) < 2:
   sys.exit('Usage: ' + sys.argv[0] + ': input CSV filename')
ifile = sys.argv[1]

# emit the standard invocation
print 'create table ' + ifile + ' ('

with open(ifile + '.csv') as inputfile:
   reader = csv.DictReader(inputfile)
   for row in reader:
      k = row.keys()
      for item in k:
         print '`' + item + '` TEXT,'
      break
   print ')\n'

해결해야 할 문제는 최종 필드 이름과 데이터 유형 선언이 쉼표로 끝나고 mySQL 파서가이를 용납하지 않는다는 것입니다.

물론 모든 필드에 TEXT 데이터 유형을 사용한다는 문제도 있습니다. 테이블에 수백 개의 열이있는 경우 VARCHAR (64)는 테이블을 너무 크게 만듭니다.

이것은 또한 mySQL의 최대 열 수에서 중단되는 것 같습니다. 가능한 경우 Hive 또는 HBase로 이동할 때입니다.


1

csvMySQL 커넥터를 사용하여 Python에서 수행 한 방법은 다음과 같습니다 .

import csv
import mysql.connector

credentials = dict(user='...', password='...', database='...', host='...')
connection = mysql.connector.connect(**credentials)
cursor = connection.cursor(prepared=True)
stream = open('filename.csv', 'rb')
csv_file = csv.DictReader(stream, skipinitialspace=True)

query = 'CREATE TABLE t ('
query += ','.join('`{}` VARCHAR(255)'.format(column) for column in csv_file.fieldnames)
query += ')'
cursor.execute(query)
for row in csv_file:
    query = 'INSERT INTO t SET '
    query += ','.join('`{}` = ?'.format(column) for column in row.keys())
    cursor.execute(query, row.values())

stream.close()
cursor.close()
connection.close()

키 포인트

  • INSERT에 준비된 문 사용
  • 'rb'바이너리로 file.csv 열기
  • 옵션 과 같은 일부 CSV 파일은 조정 이 필요할 수 skipinitialspace있습니다.
  • 경우 255없는 충분히 넓은 당신은 INSERT에 에러가 발생하고 다시 시작해야합니다.
  • 열 유형 조정, 예 : ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • 기본 키 추가 , 예 :ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

0

mysql 테이블로 CSV 파일 가져 오기

LOAD DATA LOCAL INFILE 'd:\\Site.csv' INTO TABLE `siteurl` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

Character   Escape Sequence
\0      An ASCII NUL (0x00) character
\b      A backspace character
\n      A newline (linefeed) character
\r      A carriage return character
\t      A tab character.
\Z      ASCII 26 (Control+Z)
\N      NULL

방문 : http://www.webslessons.com/2014/02/import-csv-files-using-php-and-mysql.html


0

다른 사람들이 언급했듯이로드 데이터 로컬 infile은 잘 작동합니다. Hawkee가 게시 한 PHP 스크립트를 사용해 보았지만 작동하지 않았습니다. 디버그하는 대신 내가 한 일은 다음과 같습니다.

1) CSV 파일의 헤더 행을 txt 파일에 복사 / 붙여 넣기하고 emacs로 편집합니다. 각 필드 사이에 쉼표와 CR을 추가하여 각각의 줄에 표시하십시오.
2) 해당 파일을 FieldList.txt로 저장합니다.
3) 각 필드에 대한 defns를 포함하도록 파일을 편집합니다 (대부분은 varchar 이었지만 상당수는 int (x)였습니다. 파일 시작 부분에 테이블 이름 생성 (및 CreateTable.sql 이름으로 저장. 파일의 그것을 끝
) 4 표 작성하는 Createtable.sql 파일에서 입력을 MySQL의 클라이언트를 시작
'LOAD DATA INFILE'명령의 대부분에서 붙여 넣기 내 테이블을 subsituting / 복사, 5)를 시작 MySQL의 클라이언트를 이름 및 csv 파일 이름. FieldList.txt 파일에 붙여 넣습니다. 필드 목록에 붙여 넣기 전에 'IGNORE 1 LINES'를 포함해야합니다.

많은 작업처럼 들리지만 emacs에서는 쉽습니다 .....


0

TablePlus 응용 프로그램 사용 : 오른쪽 패널에서 테이블 이름을 마우스 오른쪽 버튼으로 클릭합니다. 가져 오기 ...> CSV에서 CSV 파일 선택 열 일치를 검토하고 모두 가져 오기를 누르십시오!


-3

나는 csv를 mysql로 ​​가져오고, "load data infile"을 포함하고, mysql workbench를 사용하는 등 다양한 방법으로 Google 검색을 수행했습니다.

mysql workbench 가져 오기 버튼을 사용할 때 먼저 빈 테이블을 직접 만들고 각 열 유형을 직접 설정해야합니다. 참고 : null 및 auto_increment가 아닌 기본 키로 끝에 ID 열을 추가해야합니다. 그렇지 않으면 나중에 가져 오기 단추가 표시되지 않습니다. 그러나 CSV 파일로드를 시작하면 아무것도로드되지 않고 버그처럼 보입니다. 나는 포기한다.

지금까지 찾은 가장 쉬운 방법은 Oracle의 mysql을 사용하여 Excel을 사용하는 것입니다. 당신은 여기에서 다운로드 할 수 있습니다 엑셀 MySQL은

이것은 당신이 할 일입니다 : Excel에서 csv 파일을 열고 데이터 탭에서 Excel 용 mysql 버튼을 찾으십시오.

모든 데이터를 선택하고 mysql로 ​​내보내기를 클릭합니다. ID 열을 기본 키로 설정하는 것에 유의하십시오.

완료되면 mysql 워크 벤치로 이동하여 테이블을 변경하십시오. 예를 들어 통화 유형은 일반 사용을 위해 10 진수 (10,2)가 많은 경우 decimal (19,4)이어야합니다. 다른 필드 유형은 varchar (255)로 설정할 수 있습니다.

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