MYSQL นำเข้าข้อมูลจาก csv โดยใช้ LOAD DATA INFILE


106

ฉันกำลังนำเข้าข้อมูลจำนวน 20,000 แถวจากไฟล์ CSV ไปยัง Mysql

คอลัมน์ใน CSV อยู่ในลำดับที่แตกต่างจากคอลัมน์ของตาราง MySQL วิธีกำหนดคอลัมน์ที่สอดคล้องกับคอลัมน์ตาราง Mysql โดยอัตโนมัติ?

เมื่อฉันดำเนินการ

LOAD DATA INFILE'abc.csv' INTO TABLE abc

แบบสอบถามนี้เพิ่มข้อมูลทั้งหมดในคอลัมน์แรก

โปรดแนะนำไวยากรณ์อัตโนมัติสำหรับการนำเข้าข้อมูลไปยัง Mysql


มีหัวข้อคล้ายกันในstackoverflow.com/questions/11077801/import-csv-to-mysql-table/…
marciomolusco

เกิดขึ้นกับฉันฉันพบว่าไฟล์ข้อความถูกเขียนด้วยบรรทัดที่สิ้นสุดโดย '\ r' และฉันพยายามนำเข้าข้อมูลโดยคาดว่าบรรทัดจะถูกยกเลิกโดยใช้ '\ n'
Tamer

2
ผมเขียนกวดวิชาอย่างกว้างขวางในการโหลดข้อมูล CSV เข้า MySQLพร้อมกับเครื่องมือเครื่องกำเนิดไฟฟ้าไวยากรณ์ใน Excel น่าจะเป็นประโยชน์กับผู้อ่าน
mysql_user

คำตอบ:


172

คุณสามารถใช้คำสั่งLOAD DATA INFILEเพื่ออิมพอร์ตไฟล์ csvลงในตาราง

ตรวจสอบการเชื่อมโยงนี้MySQL - โหลดข้อมูล 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:

การใช้LOCALคีย์เวิร์ดถือเป็นความเสี่ยงด้านความปลอดภัยและเมื่อ MySQL 8.0 LOCALความสามารถถูกตั้งค่าเป็นค่าFalseเริ่มต้น คุณอาจเห็นข้อผิดพลาด:

ข้อผิดพลาด 1148: ไม่อนุญาตให้ใช้คำสั่งที่ใช้กับ MySQL เวอร์ชันนี้

คุณสามารถเขียนทับโดยทำตามคำแนะนำในเอกสาร ระวังว่าการเขียนทับดังกล่าวไม่ได้ช่วยแก้ปัญหาด้านความปลอดภัย แต่เป็นเพียงการรับทราบว่าคุณตระหนักและเต็มใจที่จะรับความเสี่ยง


1
ฉันขอทราบIGNORE 1 LINESว่าที่นี่มีอะไรบ้าง? ขอบคุณล่วงหน้า.
Koushik Das

5
@KoushikDas มันจะละเว้นบรรทัดแรกที่กำหนดชื่อคอลัมน์
Saharsh Shah

28
ข้อควรระวัง: LINES TERMINATED BY '\ r \ n' ใช้งานได้กับไฟล์ windows แต่ไฟล์ linux ควรมี '\ n' เท่านั้น
ChuckCottrill

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
โหลดข้อมูลข้อมูลท้องถิ่น ... หากไม่มี LOCAL ก็ถูกปฏิเสธการเข้าถึง
ketankk

50

ก่อนนำเข้าไฟล์คุณต้องเตรียมสิ่งต่อไปนี้:

  • ตารางฐานข้อมูลที่จะนำเข้าข้อมูลจากไฟล์
  • ไฟล์ 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 ฉันจะข้ามฟิลด์ "มุมมอง" ได้อย่างไร
Ansari ชาวเดนมาร์ก

@MD เดนมาร์ก 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

แทรกข้อมูลจำนวนมากมากกว่า 7000000 ระเบียนใน 1 นาทีในฐานข้อมูล (แบบสอบถามที่เร็วมากพร้อมการคำนวณ)

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 INFILEจาก windows shell และคุณจำเป็นต้องใช้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' ชื่อตาราง 'การให้คะแนน' และชื่อฐานข้อมูล 'ภาพยนตร์'

หาก xampp ของคุณติดตั้งใน "C: \ xampp \"

คัดลอกไฟล์ "Ratings.txt" ของคุณในโฟลเดอร์ "C: \ xampp \ mysql \ data \ movies"

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 จึงไม่สามารถดำเนินการคำสั่งนี้ได้

สิ่งนี้ใช้ได้กับฉันใน windows 8.1 64 บิตโดยใช้ wampserver 3.0.6 64bit

แก้ไขไฟล์ my.ini จาก C: \ wamp64 \ bin \ mysql \ mysql5.7.14

ลบรายการ secure_file_priv c: \ wamp64 \ tmp \ (หรืออะไรก็ได้ที่คุณมีที่นี่)

หยุดทุกอย่าง - ออกจาก wamp ฯลฯ - และรีสตาร์ททุกอย่าง จากนั้นลากไฟล์ cvs ของฉันไปที่ C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (dir คนสุดท้ายเป็นชื่อฐานข้อมูลของฉัน)

ดำเนินการ LOAD DATA INFILE 'myfile.csv'

เข้าสู่ตารางศิษย์เก่า

ฟิลด์ที่ถูกยุติโดย ','

โดย "" "

เส้นที่ถูกยุติโดย '\ r \ n'

ไม่สนใจ 1 บรรทัด

... และ VOILA !!!


0

คุณสามารถลองแทรกแบบนี้:

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

0

ภายในวันนี้ (สิ้นสุดปี 2019) ฉันชอบใช้เครื่องมือเช่นhttp://www.convertcsv.com/csv-to-sql.htm ฉันมีแถวมากมายคุณสามารถเรียกใช้บล็อกที่แบ่งพาร์ติชันเพื่อบันทึกข้อผิดพลาดของผู้ใช้เมื่อ csv มาจาก สเปรดชีตผู้ใช้ขั้นสุดท้าย

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