วิธีที่ดีที่สุด / เร็วที่สุดในการอัปโหลดไฟล์ csv ไปยังตาราง mysql คืออะไร ฉันต้องการให้ใช้ข้อมูลแถวแรกเป็นชื่อคอลัมน์
พบสิ่งนี้:
วิธีการนำเข้าไฟล์ CSV ไปยังตาราง MySQL
แต่คำตอบเดียวคือใช้ GUI ไม่ใช่เชลล์?
วิธีที่ดีที่สุด / เร็วที่สุดในการอัปโหลดไฟล์ csv ไปยังตาราง mysql คืออะไร ฉันต้องการให้ใช้ข้อมูลแถวแรกเป็นชื่อคอลัมน์
พบสิ่งนี้:
วิธีการนำเข้าไฟล์ CSV ไปยังตาราง MySQL
แต่คำตอบเดียวคือใช้ GUI ไม่ใช่เชลล์?
คำตอบ:
แทนที่จะเขียนสคริปต์เพื่อดึงข้อมูลจากไฟล์ 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 โดยตรง
ในกรณีของคุณคุณจะต้องเขียนล่ามก่อนเพื่อค้นหาแถวแรกและกำหนดให้เป็นชื่อคอลัมน์
จากเอกสาร 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)
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'
หากใช้ CSV จาก Windows และในที่สุดการหลีกเลี่ยงชื่อเขตข้อมูลด้วยการแบ็คทิกนั้นฉลาดในกรณีที่มีช่องว่าง:$columns .= "`$column` varchar(250)";
หากคุณมีความสามารถในการติดตั้ง phpadmin มีส่วนการนำเข้าที่คุณสามารถนำเข้าไฟล์ csv ไปยังฐานข้อมูลของคุณได้แม้กระทั่งช่องทำเครื่องหมายเพื่อตั้งค่าส่วนหัวเป็นบรรทัดแรกของไฟล์ที่มีชื่อคอลัมน์ตาราง (หากไม่ได้เลือกไว้ บรรทัดแรกจะกลายเป็นส่วนหนึ่งของข้อมูล
ขั้นแรกให้สร้างตารางในฐานข้อมูลโดยมีจำนวนคอลัมน์เดียวกันกับที่อยู่ในไฟล์ csv
จากนั้นใช้แบบสอบถามต่อไปนี้
LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
ในการโหลดข้อมูลจากไฟล์ข้อความหรือไฟล์ 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 ถ้าคุณทำได้
นี่คือวิธีที่ฉันทำใน 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()
ประเด็นสำคัญ
'rb'
ไบนารีskipinitialspace
ตัวเลือก255
ไม่กว้างพอคุณจะได้รับข้อผิดพลาดใน INSERT และต้องเริ่มต้นใหม่ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;
นำเข้าไฟล์ 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
ดังที่คนอื่น ๆ ได้กล่าวไว้การโหลดข้อมูลในเครื่อง 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 .....
ใช้แอปพลิเคชัน TablePlus: คลิกขวาที่ชื่อตารางจากแผงด้านขวาเลือกนำเข้า ... > จาก CSV เลือกคอลัมน์ตรวจสอบไฟล์ CSV ที่ตรงกันและกดนำเข้าเสร็จสิ้นทั้งหมด!
ฉันค้นหาด้วย 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)