csv 파일을 mysql 테이블에 업로드하는 가장 좋은 / 가장 빠른 방법은 무엇입니까? 데이터의 첫 번째 행을 열 이름으로 사용하고 싶습니다.
발견 :
그러나 유일한 대답은 셸이 아닌 GUI를 사용하는 것이 었습니까?
csv 파일을 mysql 테이블에 업로드하는 가장 좋은 / 가장 빠른 방법은 무엇입니까? 데이터의 첫 번째 행을 열 이름으로 사용하고 싶습니다.
발견 :
그러나 유일한 대답은 셸이 아닌 GUI를 사용하는 것이 었습니까?
답변:
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로 직접 가져 오기
귀하의 경우에는 첫 번째 행을 찾고 열 이름으로 할당하기 위해 먼저 인터프리터를 작성해야합니다.
구문 에 대한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)
IGNORE 1 LINES
쿼리에 추가 할 수 있습니다.
다음은 필요한 작업을 수행하는 간단한 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
fields terminated by ','
그것도 부분적으로 이중 인용 CSV를 함께 작동 ....
ENCLOSED BY '\"'
... 또한 LINES TERMINATED BY '\r\n'
Windows에서 CSV를 사용하는 경우 많은 사람들이 필요 합니다. 마지막으로 공백이있는 경우 백틱으로 필드 이름을 이스케이프하는 것이 현명합니다.$columns .= "`$column` varchar(250)";
텍스트 파일 또는 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
mysql을 "mysql -u -p --local-infile"로 시작하면 정상적으로 작동합니다.
이 작업을 수행하기 위해 몇 가지 코드를 작성했습니다. 몇 가지 스 니펫을 넣겠습니다.
$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());
나는 이것과 얼마 동안 씨름했다. 문제는 데이터를로드하는 방법이 아니라 데이터를 저장할 테이블을 구성하는 방법에 있습니다. 데이터를 가져 오기 전에 테이블을 빌드하려면 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로 이동할 때입니다.
csv 및 MySQL 커넥터를 사용하여 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()
키 포인트
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
다른 사람들이 언급했듯이로드 데이터 로컬 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에서는 쉽습니다 .....
나는 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)로 설정할 수 있습니다.