นำเข้า CSV ไปยังตาราง mysql


96

วิธีที่ดีที่สุด / เร็วที่สุดในการอัปโหลดไฟล์ csv ไปยังตาราง mysql คืออะไร ฉันต้องการให้ใช้ข้อมูลแถวแรกเป็นชื่อคอลัมน์

พบสิ่งนี้:

วิธีการนำเข้าไฟล์ CSV ไปยังตาราง MySQL

แต่คำตอบเดียวคือใช้ GUI ไม่ใช่เชลล์?


3
และแม้แต่โซลูชัน GUI ก็ไม่ได้ใช้ชื่อคอลัมน์จาก csv ... คุณต้องสร้างตารางทั้งหมดก่อนที่จะนำเข้า
Dominique

คำถามมีคำตอบอยู่แล้วที่นี่stackoverflow.com/questions/3635166/…
David

คำตอบที่ยอมรับสำหรับคำถามที่คุณกำลังเชื่อมโยงคือการใช้ GUI คำตอบที่คุณอ้างอิงได้ให้ไว้เมื่อวานนี้ในขณะที่คำถาม (คำตอบ) นี้มาจากปี 2012
lcm

คำตอบ:


147

แทนที่จะเขียนสคริปต์เพื่อดึงข้อมูลจากไฟล์ CSV คุณสามารถเชื่อมโยง MYSQL เข้ากับไฟล์โดยตรงและอัปโหลดข้อมูลโดยใช้ไวยากรณ์ SQL ต่อไปนี้

ในการนำเข้าไฟล์ Excel ไปยัง MySQL ให้ส่งออกเป็นไฟล์ 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 โดยตรง

แก้ไข

ในกรณีของคุณคุณจะต้องเขียนล่ามก่อนเพื่อค้นหาแถวแรกและกำหนดให้เป็นชื่อคอลัมน์


แก้ไข -2

จากเอกสาร MySQL เกี่ยวกับLOAD DATAไวยากรณ์ :

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

วิธีการดีบักคำสั่งนี้เมื่อล้มเหลว? ฉันพยายามโหลดไฟล์ด้วยคำสั่งนี้ แต่ไม่ทำอะไรเลย

1
แล้วถ้าฉันต้องการละเว้นคอลัมน์ใน csv ล่ะ?
Marci-man

วิธีให้สิทธิ์สำหรับไฟล์ในเครื่อง csv ของฉันเพื่อให้เข้าถึงได้โดยเซิร์ฟเวอร์ mysql ที่ทำงานบน aws (rds)
rahul

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 ที่ยกมาสองครั้ง (อ่านโดยคนส่วนใหญ่) ให้เพิ่ม `` ENCASED IN '\ "' 'ถึงfields terminated by ','... มันยังใช้งานได้กับ CSV ที่ยกมาสองครั้ง
Joel Mellon

3
ฉันคิดว่าคุณหมายถึงENCLOSED BY '\"'... ผู้คนจำนวนมากจะต้องการLINES TERMINATED BY '\r\n'หากใช้ CSV จาก Windows และในที่สุดการหลีกเลี่ยงชื่อเขตข้อมูลด้วยการแบ็คทิกนั้นฉลาดในกรณีที่มีช่องว่าง:$columns .= "`$column` varchar(250)";
dlo

1
คำตอบนี้ดีกว่าคำตอบที่ยอมรับมาก โดยเฉพาะอย่างยิ่งมันช่วยให้สิ่งที่ OP ขอและฉันยังต้องการ: "ข้อมูลแถวแรกถูกใช้เป็นชื่อคอลัมน์" (ฉันต้องการสคริปต์ใน Python ดังนั้นฉันจึงไม่ต้องติดตั้ง PHP แต่ก็ไม่ควรยากที่จะพอร์ต)
LarsH

2
@YumYumYum คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับปัญหาที่คุณประสบได้หรือไม่?
Hawkee

ฉันขอซื้อเบียร์ให้คุณได้ไหม
โจ

4

หากคุณมีความสามารถในการติดตั้ง phpadmin มีส่วนการนำเข้าที่คุณสามารถนำเข้าไฟล์ csv ไปยังฐานข้อมูลของคุณได้แม้กระทั่งช่องทำเครื่องหมายเพื่อตั้งค่าส่วนหัวเป็นบรรทัดแรกของไฟล์ที่มีชื่อคอลัมน์ตาราง (หากไม่ได้เลือกไว้ บรรทัดแรกจะกลายเป็นส่วนหนึ่งของข้อมูล


ฉันแปลกใจจริงๆที่คุณต้องใช้โปรแกรมเสริมเช่น phpadmin เพื่อรับฟังก์ชันนี้ขอบคุณสำหรับคำตอบ
chrisfs

นี่ทำให้วันของฉัน
มาร์ค

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

นี่คือวิธีที่ฉันทำใน 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
  • เปิด file.csv ใน'rb'ไบนารี
  • ไฟล์ CSV บางไฟล์อาจต้องมีการปรับแต่งเช่นskipinitialspaceตัวเลือก
  • หาก255ไม่กว้างพอคุณจะได้รับข้อผิดพลาดใน INSERT และต้องเริ่มต้นใหม่
  • ปรับประเภทคอลัมน์เช่น ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • เพิ่มคีย์หลักเช่นALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

0

นำเข้าไฟล์ CSV ลงในตาราง mysql

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 ทำงานได้ดี ฉันลองใช้สคริปต์ php ที่ Hawkee โพสต์ แต่ไม่ได้ผลสำหรับฉัน แทนที่จะดีบักนี่คือสิ่งที่ฉันทำ:

1) คัดลอก / วางแถวส่วนหัวของไฟล์ CSV ลงในไฟล์ txt และแก้ไขด้วย emacs เพิ่มลูกน้ำและ CR ระหว่างแต่ละช่องเพื่อให้แต่ละช่องอยู่ในบรรทัดของตัวเอง
2) บันทึกไฟล์นั้นเป็น FieldList.txt
3) แก้ไขไฟล์เพื่อรวม defns สำหรับแต่ละฟิลด์ (ส่วนใหญ่เป็น varchar แต่ค่อนข้างน้อยเป็น int (x) เพิ่ม create table tablename (ที่จุดเริ่มต้นของไฟล์และ) ไปที่ ท้ายไฟล์บันทึกเป็น CreateTable.sql
4) เริ่มต้นไคลเอนต์ mysql ด้วยอินพุตจากไฟล์ Createtable.sql เพื่อสร้างตาราง
5) เริ่มไคลเอนต์ mysql คัดลอก / วางในคำสั่ง 'LOAD DATA INFILE' ส่วนใหญ่ที่ใช้ตารางของฉัน ชื่อและชื่อไฟล์ csv วางในไฟล์ FieldList.txt อย่าลืมใส่ "IGNORE 1 LINES" ก่อนวางในรายการฟิลด์

ฟังดูเหมือนงานเยอะ แต่ง่ายด้วย emacs .....


0

ใช้แอปพลิเคชัน TablePlus: คลิกขวาที่ชื่อตารางจากแผงด้านขวาเลือกนำเข้า ... > จาก CSV เลือกคอลัมน์ตรวจสอบไฟล์ CSV ที่ตรงกันและกดนำเข้าเสร็จสิ้นทั้งหมด!


-3

ฉันค้นหาด้วย Google หลายวิธีในการนำเข้า csv ไปยัง mysql รวมถึง "load data infile" ใช้ mysql workbench เป็นต้น

เมื่อฉันใช้ปุ่มนำเข้า mysql workbench ขั้นแรกคุณต้องสร้างตารางว่างด้วยตัวคุณเองตั้งค่าคอลัมน์แต่ละประเภทด้วยตัวคุณเอง หมายเหตุ: คุณต้องเพิ่มคอลัมน์ ID ที่ส่วนท้ายเป็นคีย์หลักไม่ใช่ null และ auto_increment มิฉะนั้นปุ่มนำเข้าจะไม่ปรากฏในภายหลัง อย่างไรก็ตามเมื่อฉันเริ่มโหลดไฟล์ CSV ไม่มีอะไรโหลดเลยดูเหมือนว่าจะเป็นจุดบกพร่อง ฉันยอมแพ้.

โชคดีวิธีที่ง่ายที่สุดที่ฉันพบคือใช้ mysql ของ Oracle สำหรับ excel คุณสามารถดาวน์โหลดได้จากที่นี่mysql for excel

นี่คือสิ่งที่คุณจะทำ: เปิดไฟล์ csv ใน excel ที่แท็บข้อมูลค้นหา mysql สำหรับปุ่ม excel

เลือกข้อมูลทั้งหมดคลิกส่งออกไปยัง mysql หมายเหตุเพื่อตั้งค่าคอลัมน์ ID เป็นคีย์หลัก

เมื่อเสร็จแล้วให้ไปที่โต๊ะทำงาน mysql เพื่อแก้ไขตารางเช่นประเภทสกุลเงินควรเป็นทศนิยม (19,4) สำหรับทศนิยมจำนวนมาก (10,2) สำหรับการใช้งานปกติ อาจตั้งค่าฟิลด์ประเภทอื่นเป็น varchar (255)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.