source

CSV 파일을 MySQL 테이블로 Import하는 방법

gigabyte 2022. 9. 8. 22:20
반응형

CSV 파일을 MySQL 테이블로 Import하는 방법

CSV 파일을 MySQL 테이블로 Import하려면 어떻게 해야 합니까?첫 번째 데이터 행을 열명으로 사용했으면 합니다.

CSV 파일을 MySQL 테이블로 Import하려면 어떻게 해야 합니까?라고 읽었는데, 유일한 답은 셸이 아닌 GUI를 사용하는 것이었습니다.

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

Excel 파일을 MySQL로 Import하려면 먼저 CSV 파일로 내보냅니다.생성된 CSV 파일에서 CSV 헤더를 Excel이 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로 직접 Import

편집

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


편집-2

구문에 대한 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)

필요한 작업을 수행하는 간단한 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

phpadmin을 설치할 수 있는 기능이 있는 경우 데이터베이스로 csv 파일을 Import할 수 있는 섹션이 있습니다.또한 파일의 첫 번째 행에 헤더를 설정하는 체크박스가 붙어 있습니다(이 체크박스를 끄면 첫 번째 행은 데이터의 일부가 됩니다).

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

그런 다음 다음 쿼리를 사용합니다.

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

mysql을 "mysql -u -p --local-infile"로 시작하면 정상적으로 동작합니다.

텍스트 파일 또는 csv 파일에서 데이터를 로드하려면 다음 명령을 사용합니다.

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

위의 명령어에서는 로딩되는 컬럼이1개밖에 없기 때문에 "종료자"와 "폐쇄자"가 없기 때문에 비워두었습니다.그렇지 않으면 프로그래머는 구분문자를 입력할 수 있습니다.예를 들어, (콤마), "또는;" 등입니다.

**mysql 버전5 이후 사용하시는 분**

에 아래 이 mysql 측면에 .etc/mysql/my.cnf

my.cnf 명령어를 편집하려면

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
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

다음으로 Import 방법을 mysql에 지시할 수 있도록 CSV 헤더를 가져옵니다(주의: 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());

나는 한동안 이것과 씨름했다.문제는 데이터를 로드하는 방법이 아니라 데이터를 유지하기 위한 테이블을 구성하는 방법에 있습니다.데이터를 Import하기 전에 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의 최대 열 수에서도 끊어질 수 있습니다.가능하다면 하이브나 HBase로 옮겨야 할 때입니다.

다음은 Python에서 csv와 MySQL Connector를 사용한 방법입니다.

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에 대해 준비된 문구를 사용합니다.
  • 「.csv」의 를 .'rb'
  • 일부 CSV 파일에는 다음과 같은 조정이 필요할 수 있습니다.skipinitialspace★★★★★★ 。
  • if255폭이 충분하지 않아 INSERT에서 오류가 발생하여 다시 시작해야 합니다.
  • 유형을 열유(((((((((((((((((((((:ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • 프라이머리 키를 추가합니다.ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

CSV 파일을 mysql 테이블로 Import합니다.

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

TablePlus 응용 프로그램 사용:오른쪽 패널에서 테이블 이름을 마우스 오른쪽 버튼으로 클릭합니다. Import...를 선택합니다.> CSV에서 CSV 파일 Review column matching을 선택하고 Import All을 클릭합니다.

다른 사용자가 언급했듯이 로드 데이터 로컬 파일도 정상적으로 작동합니다.Hawkee가 올린 php 스크립트를 시도해 봤지만 효과가 없었습니다.디버깅을 하지 않고 다음과 같이 했습니다.

Emacs1) CSV "txt"/"Emacs"를 합니다.각 필드 사이에 쉼표와 CR을 추가하여 각 필드를 고유한 행으로 가져옵니다.
2)을 FieldList2) "FieldList" 로 저장합니다txt의
3) 각 필드에 대한 정의를 포함하도록 파일을 편집합니다(대부분은 varchar였지만 상당수는 int(x)였습니다).table * (및 )을 합니다.create table *tablename* (태블 이름*)은 파일합니다.CreateTable.sql을 지정합니다.
4) Createtable의 mysql 를 시작하여.sql file sql sql sql 。
table 및name.5) mysql .FieldList.파일입니다. 1 LINEs. 목록에 에 반드시 ' 1 LINEs.IGNORE 1 LINE'을 사용합니다.

일이 많은 것 같지만 Emacs는 쉬워요

그래서 Hawkee가 준 스크립트를 사용하려고 했지만 일부 명령어가 오래되었습니다.mysql_X 사용은 감가상각되어 mysqli_x로 대체해야 합니다.트러블 슈팅을 실시한 후, 이하의 스크립트를 작성했습니다.이 스크립트는 정상적으로 동작하고 있습니다.

주의: 다음 코드는 플로트를 입력하는 것을 전제로 합니다.이 스크립트를 사용하여 WHO에서 성장과 관련된 통계를 백분위수로 가져옵니다.

테이블을 드롭하려면 (파일 이름 앞에) -drop을 사용합니다.

<?php
//This script is for importing the percentile values.
//Written by Daniel Pflieger @ GrowlingFlea Software

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

//options.  This is what we need so the user can specify whether or not to drop the table
$short_options = "d::";
$options = getopt($short_options);

//check if the flag "-drop" is entered by the end user.  
if (!empty($options) &&  $options['d'] != "rop"){
    echo "The only available argument is -drop \n";
    exit;
} else if (!empty($options)){
    $dropTable = true;

} else {
    $dropTable = false;

}

//we use mysqli_* since this is required with newer versions of php
$db = mysqli_connect($host, $user, $pass, $database);

// argv changes if the drop flag is used. here we read in the name of the .csv file we want to import
if (isset($argv[1]) && empty($options) ) {
    $file = $argv[1];
} else  if (isset($argv[2]) && $options[1] = "rop" ) {
    $file = $argv[2];
}

//we call the table name the name of the file.  Since this script was used to import who growth chart info
//I appended the '_birth_to_5yrs' to the string.  You probably want to remove this and add something that
//makes sense to you
$table = pathinfo($file);
$table = "who_" . $table['filename'] . "_birth_to_5yrs";
$table = str_replace('-', '_', $table);

// We read the first line of the .csv file.  It is assumed that these are the headers.
$fp = fopen($file, 'r');
$frow = fgetcsv($fp);
$columns = '';

//we get the header names and for this purpose we make every value 'float'.  If you are unsure of
//the datatype you can probably use varchar(250).
foreach($frow as $column) {
    $columns .= "`" .$column . "` float,";

}

//drop the table to prevent data issues, if that is what the end user selects
if ($dropTable) {
    mysqli_query($db, "drop table if exists $table");

}

// here we form the create statement and we create the table.
// we use the mysqli_real_escape_string to make sure we dont damage the DB
$create = "create table if not exists $table ($columns);";
$create = str_replace(',)', ')', $create);
$create = mysqli_real_escape_string($db, $create);
mysqli_query($db, $create);

// We read the values line-by-line in the .csv file and insert them into the table until we are done.
while ($frow = fgetcsv($fp)){
    $insert = implode(", ", $frow);
    $insert = "Insert into $table VALUES ( $insert )";
    $insert = mysqli_real_escape_string($db, $insert);
    $insert = mysqli_query($db, $insert);
}
   

스크립트 실행 방법의 예를 다음에 나타냅니다.

php ../git/growlingflea-dev-tools/importCSV.php -drop wfh-female-percentiles-expanded-tables.csv

csv를 mysql로 Import하는 방법, "load data infile", mysql workbench를 사용하는 방법 등 구글 검색을 많이 하고 있습니다.

mysql workbench Import 버튼을 사용할 경우 먼저 빈 테이블을 직접 만들고 각 컬럼 유형을 직접 설정해야 합니다.주의: ID 열은 null 및 auto_increment가 아닌 프라이머리 키로 마지막에 추가해야 합니다.그렇지 않으면 나중에 Import 버튼이 표시되지 않습니다.그러나 CSV 파일을 로드하면 아무것도 로드되지 않아 버그처럼 보입니다.전 못하겠어요.

Lucky, 지금까지 찾은 가장 쉬운 방법은 Oracle의 mysql을 엑셀로 사용하는 것입니다.엑셀을 위해 mysql에서 다운로드 할 수 있습니다.

다음과 같이 합니다.엑셀에서 csv 파일을 열고 데이터 탭에서 엑셀의 mysql을 찾습니다.

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

종료 후 mysql 워크벤치로 이동하여 표를 변경합니다.예를 들어 통화 타입은 10진수(10,2)가 큰 경우에는 10진수(19,4)여야 합니다.기타 필드 유형은 varchar(255)로 설정할 수 있습니다.

언급URL : https://stackoverflow.com/questions/11077801/how-to-import-a-csv-file-into-a-mysql-table

반응형