Impor CSV ke tabel mysql

96

Apa cara terbaik / tercepat untuk mengupload file csv ke tabel mysql? Saya ingin baris pertama data digunakan sebagai nama kolom.

Menemukan ini:

Bagaimana cara mengimpor file CSV ke tabel MySQL

Tetapi satu-satunya jawaban adalah menggunakan GUI dan bukan shell?

lcm
sumber
3
Dan bahkan solusi GUI tidak mengambil nama kolom dari csv ... Anda perlu membuat seluruh tabel sebelum mengimpor-
Dominique
Pertanyaannya sudah memiliki jawaban di sini stackoverflow.com/questions/3635166/…
David
jawaban yang diterima untuk pertanyaan yang Anda tautkan menggunakan GUI. Jawaban Anda adalah referensi diberikan kemarin sedangkan pertanyaan ini (jawaban) adalah dari 2012.
lcm

Jawaban:

147

Alih-alih menulis skrip untuk menarik informasi dari file CSV, Anda dapat menautkan MYSQL secara langsung ke sana dan mengunggah informasi menggunakan sintaks SQL berikut.

Untuk mengimpor file Excel ke MySQL, ekspor dulu sebagai file CSV. Hapus header CSV dari file CSV yang dihasilkan bersama dengan data kosong yang mungkin diletakkan Excel di akhir file CSV.

Anda kemudian dapat mengimpornya ke dalam tabel MySQL dengan menjalankan:

load data local infile 'uniq.csv' into table tblUniq fields terminated by ','
  enclosed by '"'
  lines terminated by '\n'
    (uniqName, uniqCity, uniqComments)

as read on: Impor file CSV langsung ke MySQL

EDIT

Untuk kasus Anda, Anda harus menulis juru bahasa terlebih dahulu, untuk menemukan baris pertama, dan menetapkannya sebagai nama kolom.


EDIT-2

Dari dokumen MySQL tentang LOAD DATAsintaks :

The IGNORE number LINESpilihan dapat digunakan untuk mengabaikan garis pada awal file. Misalnya, Anda dapat menggunakan IGNORE 1 LINESuntuk melewati baris header awal yang berisi nama kolom:

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

Oleh karena itu, Anda dapat menggunakan pernyataan berikut:

LOAD DATA LOCAL INFILE 'uniq.csv'
INTO TABLE tblUniq
FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(uniqName, uniqCity, uniqComments)
hjpotter92
sumber
8
Alih-alih menghapus baris pertama, Anda dapat menambahkan IGNORE 1 LINESke kueri
mb14
Apakah Anda tahu jika ada cara untuk mengatur jalur file ke file csv?
JasonDavis
Bagaimana cara men-debug perintah ini ketika gagal? saya mencoba memuat file dengan perintah ini tetapi tidak melakukan apa-apa.
bagaimana jika saya ingin mengabaikan kolom di csv?
Marci-man
cara memberi izin file lokal csv saya untuk diakses oleh server mysql yang berjalan di aws (rds)
rahul
24

Berikut ini skrip baris perintah PHP sederhana yang akan melakukan apa yang Anda butuhkan:

<?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);

?>

Ini akan membuat tabel berdasarkan baris pertama dan mengimpor baris yang tersisa ke dalamnya. Berikut adalah sintaks baris perintah:

php csv_import.php csv_file.csv table_name
Hawkee
sumber
2
Skrip yang luar biasa. Bagi mereka yang memiliki file CSV dengan kutipan ganda (baca kebanyakan orang) tambahkan `` ENCASED IN '\ "' ke fields terminated by ','... bahkan bekerja dengan CSV yang dikutip ganda.
Joel Mellon
3
Saya pikir maksud Anda ENCLOSED BY '\"'... juga, banyak orang akan membutuhkan LINES TERMINATED BY '\r\n'jika menggunakan CSV dari Windows. Dan terakhir, menghindari nama lapangan dengan backticks adalah bijaksana jika ada spasi:$columns .= "`$column` varchar(250)";
dlo
1
Jawaban ini jauh lebih baik daripada jawaban yang diterima. Secara khusus itu memungkinkan apa yang diminta OP, dan saya juga ingin: "baris pertama data digunakan sebagai nama kolom". (Saya lebih suka skrip dengan Python, jadi saya tidak perlu menginstal PHP, tetapi seharusnya tidak sulit untuk
mem-
2
@YumYumYum Bisakah Anda menjelaskan lebih lanjut tentang masalah yang Anda hadapi?
Hawkee
Bolehkah aku membelikanmu bir?
Joe
4

jika Anda memiliki kemampuan untuk menginstal phpadmin ada bagian impor di mana Anda dapat mengimpor file csv ke database Anda bahkan ada kotak centang untuk mengatur header ke baris pertama file yang berisi nama kolom tabel (jika ini tidak dicentang, baris pertama akan menjadi bagian dari data

Jose Ortiz
sumber
Saya sangat terkejut bahwa Anda harus menggunakan add-on seperti phpadmin untuk mendapatkan fungsi ini, Terima kasih atas jawaban Anda
chrisfs
Ini baru saja membuat hari saya menyenangkan
Markus
4

Pertama buat tabel di database dengan jumlah kolom yang sama yang ada di file csv.

Kemudian gunakan kueri berikut

LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
Mukesh
sumber
bagaimana jika saya ingin mengabaikan kolom di csv?
Marci-man
3

Untuk memuat data dari file teks atau file csv perintahnya adalah

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

Dalam perintah di atas, dalam kasus saya hanya ada satu kolom yang akan dimuat sehingga tidak ada "diakhiri oleh" dan "dilingkupi oleh" jadi saya membiarkannya kosong kalau tidak programmer dapat memasukkan karakter pemisah. untuk mis. , (koma) atau "atau; atau apapun.

** untuk orang yang menggunakan mysql versi 5 ke atas **

Sebelum memuat file ke mysql harus memastikan bahwa baris derek di bawah ditambahkan di samping etc/mysql/my.cnf

untuk mengedit perintah my.cnf adalah

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  
Rakesh
sumber
3

Jika Anda memulai mysql sebagai "mysql -u -p --local-infile", ini akan berfungsi dengan baik

marciomolusco.dll
sumber
2

Saya menulis beberapa kode untuk melakukan ini, saya akan memasukkan beberapa cuplikan:

$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

Kemudian dapatkan header CSV sehingga Anda dapat memberi tahu mysql cara mengimpor (catatan: pastikan kolom mysql Anda sama persis dengan kolom csv):

//extract headers from .csv for use in import command
$headers = str_replace("\"", "`", array_shift(file($path)));
$headers = str_replace("\n", "", $headers);

Kemudian kirim kueri Anda ke server 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());
ravenchilde.dll
sumber
1

Saya bergumul dengan ini untuk beberapa waktu. Masalahnya bukan terletak pada bagaimana memuat data, tetapi bagaimana membangun tabel untuk menampungnya. Anda harus membuat pernyataan DDL untuk membuat tabel sebelum mengimpor data.

Sangat sulit jika tabel memiliki banyak kolom.

Berikut skrip python yang (hampir) melakukan pekerjaan itu:

#!/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'

Masalah yang harus dipecahkan adalah bahwa deklarasi nama kolom dan tipe data terakhir diakhiri dengan koma, dan parser mySQL tidak akan mentolerirnya.

Tentu saja ia juga memiliki masalah karena ia menggunakan tipe data TEXT untuk setiap bidang. Jika tabel memiliki beberapa ratus kolom, maka VARCHAR (64) akan membuat tabel menjadi terlalu besar.

Ini juga tampaknya merusak jumlah kolom maksimum untuk mySQL. Saat itulah saatnya pindah ke Hive atau HBase jika Anda bisa.

agentv
sumber
1

Inilah cara saya melakukannya dengan Python menggunakan csv dan Konektor MySQL :

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()

Poin-poin penting

  • Gunakan pernyataan yang telah disiapkan untuk SISIPKAN
  • Buka file.csv dalam 'rb'biner
  • Beberapa file CSV mungkin perlu diubah , seperti skipinitialspaceopsi.
  • Jika 255tidak cukup lebar, Anda akan mendapatkan error pada INSERT dan harus memulai kembali.
  • Sesuaikan jenis kolom, mis ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • Tambahkan kunci utama , misALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;
Bob Stein
sumber
0

Impor File CSV ke tabel 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

kunjungan: http://www.webslessons.com/2014/02/import-csv-files-using-php-and-mysql.html

Elangovan
sumber
0

Seperti yang telah disebutkan orang lain, infil lokal data muat berfungsi dengan baik. Saya mencoba skrip php yang diposting Hawkee, tetapi tidak berhasil untuk saya. Daripada men-debugnya, inilah yang saya lakukan:

1) salin / tempel baris header file CSV ke file txt dan edit dengan emacs. tambahkan koma dan CR di antara setiap bidang untuk menempatkan masing-masing di barisnya sendiri.
2) Simpan file sebagai FieldList.txt
3) mengedit file untuk memasukkan defns untuk masing-masing bidang (sebagian besar varchar, tapi beberapa yang int (x). Add membuat tabel tablename (ke awal file dan) ke akhir file. Simpan sebagai CreateTable.sql
4) mulai klien mysql dengan masukan dari file Createtable.sql untuk membuat tabel
5) mulai klien mysql, salin / tempel di sebagian besar perintah 'LOAD DATA INFILE' yang menggantikan tabel saya nama dan nama file csv. Tempel di file FieldList.txt. Pastikan untuk menyertakan 'IGNORE 1 LINES' sebelum menempel di daftar bidang

Kedengarannya banyak pekerjaan, tapi mudah dengan emacs .....

jim sims
sumber
0

Gunakan aplikasi TablePlus: Klik kanan pada nama tabel dari panel kanan Pilih Impor ...> Dari CSV Pilih file CSV Tinjau pencocokan kolom dan tekan Impor Semua selesai!

Milad Hatami
sumber
-3

Saya memiliki pencarian google banyak cara untuk mengimpor csv ke mysql, termasuk "memuat data infile", menggunakan meja kerja mysql, dll.

ketika saya menggunakan tombol impor meja kerja mysql, pertama-tama Anda perlu membuat tabel kosong sendiri, mengatur setiap jenis kolom Anda sendiri. Catatan: Anda harus menambahkan kolom ID di akhir sebagai kunci utama dan bukan null dan auto_increment, jika tidak, tombol impor tidak akan terlihat nanti. Namun, ketika saya mulai memuat file CSV, tidak ada yang dimuat, sepertinya bug. Saya menyerah.

Untungnya, cara termudah terbaik sejauh ini yang saya temukan adalah dengan menggunakan mysql Oracle untuk excel. Anda dapat mendownloadnya dari sini mysql untuk excel

Inilah yang akan Anda lakukan: buka file csv di excel, di tab Data, cari tombol mysql untuk excel

pilih semua data, klik ekspor ke mysql. Catatan untuk mengatur kolom ID sebagai kunci utama.

Setelah selesai, masuk ke meja kerja mysql untuk mengubah tabel, seperti jenis mata uang harus desimal (19,4) untuk desimal jumlah besar (10,2) untuk penggunaan biasa. jenis bidang lainnya mungkin disetel ke varchar (255).

hoogw
sumber