Bagaimana cara mengimpor file CSV ke tabel MySQL?

306

Saya memiliki CSV event-diary yang tidak dinormalkan dari klien yang saya coba muat ke dalam tabel MySQL sehingga saya bisa melakukan refactor ke dalam format yang waras. Saya membuat tabel yang disebut 'CSVImport' yang memiliki satu bidang untuk setiap kolom file CSV. CSV berisi 99 kolom, jadi ini tugas yang cukup sulit:

CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);

Tidak ada kendala di atas meja, dan semua bidang memiliki nilai VARCHAR (256), kecuali kolom yang berisi jumlah (diwakili oleh INT), ya / tidak (diwakili oleh BIT), harga (diwakili oleh DECIMAL), dan uraian teks ( diwakili oleh TEXT).

Saya mencoba memuat data ke dalam file:

LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
SELECT * FROM CSVImport;
| NULL             | NULL        | NULL           | NULL | NULL               | 
...

Seluruh meja dipenuhi NULL.

Saya pikir masalahnya adalah bahwa uraian teks berisi lebih dari satu baris, dan MySQL mem-parsing file seolah-olah setiap baris baru akan sesuai dengan satu baris databazse. Saya dapat memuat file ke OpenOffice tanpa masalah.

File clientdata.csv berisi 2593 baris, dan 570 catatan. Baris pertama berisi nama kolom. Saya pikir itu dibatasi koma, dan teks tampaknya dibatasi dengan doublequote.

MEMPERBARUI:

Jika ragu, baca manual: http://dev.mysql.com/doc/refman/5.0/id/load-data.html

Saya menambahkan beberapa informasi ke LOAD DATApernyataan bahwa OpenOffice cukup pintar untuk menyimpulkan, dan sekarang memuat jumlah catatan yang benar:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Tetapi masih ada banyak NULLcatatan yang lengkap , dan tidak ada data yang dimuat tampaknya berada di tempat yang tepat.

Iain Samuel McLean Elder
sumber
17
Dan jika Anda menggunakan OSX Sequel Pro memiliki alat impor yang luar biasa dan GRATIS ;-)
Merrick
41
Sungguh menakjubkan bagi saya bahwa poster asli menjawab pertanyaannya sendiri lebih baik daripada orang lain ... Saya tidak tahu mengapa begitu banyak orang yang begitu siap untuk memberikan rekomendasi perangkat lunak ketika ada perintah SQL yang ada, yang bisa diprogram daripada UI berbasis Saya tidak tahu tentang orang lain, tetapi secara programatik bagi saya bahwa saya dapat mengatur skrip untuk mengimpor file secara otomatis di cap waktu, sedangkan berbasis UI murni manual.
Chris Cirefice
@ ChrisCirefice: Saya pikir jawaban yang diterima menjelaskan dengan baik. Dia membutuhkan bantuan secara manual membuat perintah 'memuat data', yang dapat dibantu oleh program grafis. Setelah program grafis membuat perintah 'memuat data', ia kemudian dapat menggunakannya kembali secara terprogram.
AlexC
@Merrick ini bekerja pada osx
weaveoftheride
Saya menulis tutorial ekstensif untuk memuat data csv ke dalam mysql bersama dengan alat generator sintaksis di Excel .
mysql_user

Jawaban:

133

Inti dari masalah Anda tampaknya cocok dengan kolom dalam file CSV dengan yang ada di tabel.

Banyak klien mySQL grafis memiliki dialog impor yang sangat bagus untuk hal semacam ini.

Favorit saya untuk pekerjaan ini adalah HeidiSQL berbasis Windows . Ini memberi Anda antarmuka grafis untuk membangun LOAD DATAperintah; Anda dapat menggunakannya kembali secara terprogram nanti.

Impor file teks

Cuplikan layar: Dialog "Import textfile"

Untuk membuka dialog Impor textfile ", buka Tools > Import CSV file:

masukkan deskripsi gambar di sini

Pekka
sumber
25
Untuk Mac OSX, gunakan Sequel Pro.
Agi Hammerthief
3
Saya baru saja mencobanya dan mengharuskan saya untuk membuat tabel terlebih dahulu ... daripada menggunakan nama kolom.
Dominique
3
Anda harus memilih meja sebelum Anda dapat melanjutkan ... dan karena seluruh poinnya tidak harus membuat tabel ...
Dominique
3
Perhatikan bahwa di Linux, HeidiSQL bekerja sangat baik di bawah Wine.
AlejandroVD
1
@ Paulus sangat titik dari jawabannya adalah bahwa alat GUI dapat membuat kolom pencocokan impor ke kolom tabel lebih mudah.
Pekka
191

Gunakan mysqlimport untuk memuat tabel ke dalam database:

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv

Saya menemukannya di http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

Untuk membuat pembatas tab, gunakan --fields-terminated-by='\t'

michalzuber
sumber
6
mysqlimportmenggunakan di LOAD DATA INFILE...belakang layar, jadi itu hal yang hampir sama.
Mladen Jablanović
8
Seperti halnya LOAD DATA INFILE, Anda harus membuat tabel sebelum dapat digunakan mysqlimport.
Marcus Downing
@ MladenJablanović, ini jelas bukan hal yang sama. Coba impor baris 1bil. Anda akan terkejut betapa besar perbedaannya dalam hal kinerja
ninjabber
@ninjabber Dokumen mengatakan Klien mysqlimport menyediakan antarmuka baris perintah ke LOAD DATA INFILE , sehingga secara teori tidak mungkin untuk menawarkan manfaat kinerja apa pun LOAD DATA INFILE.
Mladen Jablanović
1
juga perlu --fields-optionally-enclosed-by=\"dan `--fields-escaped-by = \`
chaintng
80

Cara paling sederhana yang telah saya impor 200+ baris adalah di bawah perintah di jendela phpmyadmin sql

Saya memiliki tabel sederhana negara dengan dua kolom CountryId, CountryName

di sini adalah data .csvFILE CSV

di sini adalah perintah:

LOAD DATA INFILE 'c:/country.csv' 
INTO TABLE country 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

Ingat satu hal, jangan pernah muncul, di kolom kedua, jika tidak impor Anda akan berhenti

Pemberani
sumber
1
',' -> '\ t', '"' -> '' untuk file TSV dan hapus baris terakhir jika tidak ada tajuk. (harap indeks pencarian crawler ini).
Bleeding Fingers
16
Jika ini file lokal, Anda mungkin perlu LOAD DATA LOCAL INFILE. Jika ini melempar kesalahan 1148 "perintah yang digunakan tidak diizinkan", Anda dapat mengaktifkannya dengan menjalankan mysql pada baris perintah dengan --local-infile.
Big McLargeHuge
saya mendapat kesalahan: ERROR 1045 (28000): Akses ditolak untuk pengguna 'pengguna' @ '%' (menggunakan kata sandi: YES)
ARUNBALAN NV
Anda harus memberikan semua akses ke pengguna, dari panel admin lalu, coba impor skrip.
DareDevil
1
Saya mendapatkan kesalahan ini: Server MySQL berjalan dengan opsi --secure-file-priv sehingga tidak dapat menjalankan pernyataan ini
Agniswar Bakshi
66

Saya tahu bahwa pertanyaannya sudah lama , tetapi saya ingin membagikan ini

Saya Menggunakan metode ini untuk mengimpor lebih dari 100K catatan ( ~ 5MB ) dalam 0,046detik

Begini cara melakukannya:

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Sangat penting untuk memasukkan baris terakhir, jika Anda memiliki lebih dari satu bidang, yaitu biasanya ia melompati bidang terakhir (MySQL 5.6.17)

LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Kemudian, dengan asumsi Anda memiliki baris pertama sebagai judul untuk bidang Anda, Anda mungkin ingin memasukkan baris ini juga

IGNORE 1 ROWS

Ini terlihat seperti jika file Anda memiliki baris tajuk.

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);
Fahad
sumber
Saya mengimpor 16k baris dan 48 kolom. Terima kasih teman.
Renjith VR
Ini solusi terbaik. Bagi siapa pun yang penasaran seberapa cepat ini: Saya mengimpor 3,2 juta baris di bawah 14 detik pada contoh AWS Lightsail $ 20 / bulan, dengan server MySQL onboard (bukan RDS kinerja tinggi). Luar biasa!
master_gracey
Di baris ini, (field_1,field_2 , field_3);apakah ini merujuk ke daftar kolom dalam file .csv atau dalam tabel? yaitu bidang apa ini?
tera_789
@ tera_789 Yang ada di file csv Anda yang mungkin akan cocok dengan meja Anda
Fahad
Harus mengikuti format data. contoh (untuk kasus saya) <pre> first_name, last_name, dob, phone_number, email, name, lastName, 12-05-2018,54545, faiz @ gmail.com, name1, lastName1,2018-05-12,456, faiz1 @ gmail .com, name2, lastName2,2018-05-12,456, faiz2 @ gmail.com, name3, lastName3,2018-05-22,456, faiz3 @ gmail.com, name4, lastName4,1988-05-22,456, faiz4 @ gmail.com , name5, lastName5,1988-05-22,456, faiz5 @ gmail.com, name6, lastName6,1987-05-21,456, faiz6 @ gmail.com </pre>
Faiz Ahmed
32

phpMyAdmin dapat menangani impor CSV. Berikut langkah-langkahnya:

  1. Mempersiapkan file CSV untuk memiliki bidang dalam urutan yang sama dengan bidang tabel MySQL.

  2. Hapus baris tajuk dari CSV (jika ada), sehingga hanya data yang ada di file.

  3. Buka antarmuka phpMyAdmin.

  4. Pilih tabel di menu sebelah kiri.

  5. Klik tombol impor di bagian atas.

  6. Jelajahi file CSV.

  7. Pilih opsi "CSV menggunakan LOAD DATA".

  8. Masukkan "," di "bidang yang diakhiri oleh".

  9. Masukkan nama kolom dalam urutan yang sama seperti pada tabel database.

  10. Klik tombol go dan Anda selesai.

Ini adalah catatan yang saya siapkan untuk digunakan di masa depan, dan dibagikan di sini jika orang lain dapat memperoleh manfaat.

Farhan
sumber
Ini bagus dan sederhana. Saya lebih suka membuat tabel dan kolom melalui SQL (jadi saya lewati Langkah # 9) dan memasukkan data melalui mengimpor CSV. Jangan lupa untuk mengatur NULLCSV untuk bidang / kolom yang bertambah secara otomatis.
perak
Perhatikan bahwa phpMyAdmin gagal total ketika karakter Cyrillic dimasukkan ke dalam file CSV, tidak peduli Anda mengatakannya untuk menggunakan utf-8.
Fran Marzoa
Jangan lupa untuk mengubah ukuran impor jika Anda mengimpor file CSV besar. BTW itu bukan pilihan yang baik untuk file CSV besar.
Avi
Ini memerlukan pengunduhan file .csv ke klien web terlebih dahulu karena Anda tidak dapat menelusuri file csv lokal.
mckenzm
Ya Anda bisa, Anda perlu mencentang kotak centang bertanda 'Kata Kunci Lokal' dan Anda dapat menggunakan file csv lokal
chrisfs
12

Anda dapat memperbaikinya dengan mencantumkan kolom dalam pernyataan LOAD DATA Anda. Dari manual :

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

... jadi dalam kasus Anda, Anda perlu mendaftar 99 kolom dalam urutan yang muncul di file csv.

lafncow
sumber
8

Coba ini, itu berhasil untuk saya

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

IGNORE 1 ROWS di sini mengabaikan baris pertama yang berisi nama field. Perhatikan bahwa untuk nama file Anda harus mengetikkan path absolut dari file tersebut.

David
sumber
Ini jawaban terbaik. Mengapa menggunakan alat lain ketika satu perintah SQL akan dilakukan?
sdgfsdh
Apakah Anda tahu cara membuat ini berfungsi ketika Anda mencoba memuat file ke mysql berjalan di server? Ia meminta saya akses ditolak untuk file (kata sandi). Di mana memasukkan kata sandi lokasi file csv?
Baktaawar
7

Baris perintah mysql rentan terhadap terlalu banyak masalah pada impor. Inilah cara Anda melakukannya:

  • gunakan excel untuk mengedit nama header agar tidak memiliki spasi
  • simpan sebagai .csv
  • gunakan Navicat Lite Sql Browser gratis untuk mengimpor dan membuat tabel baru secara otomatis (beri nama)
  • buka tabel baru masukkan kolom nomor otomatis utama untuk ID
  • ubah jenis kolom yang diinginkan.
  • selesai!
pengguna1464271
sumber
5

Jika Anda menggunakan MySQL Workbench (saat ini versi 6.3) Anda dapat melakukannya dengan:

  1. Klik kanan pada "Tables";
  2. Memilih Wisaya Impor Data Tabel;
  3. Pilih file csv Anda dan ikuti instruksi (JSON juga dapat digunakan); Hal baiknya adalah Anda bisa membuat tabel baru berdasarkan file csv yang ingin Anda impor atau memuat data ke tabel yang sudah ada

masukkan deskripsi gambar di sini

Vitaliy Pak
sumber
+1. Saya menggunakan ini karena mysql terus memberi saya kesalahan untuk LOAD DATA INFILEdan mysqlimport("ini tidak didukung pada versi mysql ini")
clmno
Metode ini berhasil, tetapi agak lambat. Saya akan berpikir bahwa menggunakan fitur ini akan membangun INSERTpermintaan besar dan mencoba melakukan semuanya sekaligus, tetapi sepertinya melakukannya dengan cara ini sebenarnya berjalan sekali INSERTper baris.
DaveTheMinion
4

Saya melihat sesuatu yang aneh. Anda menggunakan untuk ESCAPING karakter yang sama yang Anda gunakan untuk ENCLOSING. Jadi mesin tidak tahu apa yang harus dilakukan ketika menemukan '' 'dan saya pikir itu sebabnya tidak ada yang tampak di tempat yang tepat. Saya pikir jika Anda menghapus garis ESCAPING, harus berjalan dengan baik. Seperti:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Kecuali Anda menganalisis (secara manual, visual, ...) CSV Anda dan temukan karakter mana yang digunakan untuk melarikan diri. Terkadang '\'. Tetapi jika Anda tidak memilikinya, jangan menggunakannya.

Juan
sumber
3

Namun solusi lain adalah dengan menggunakan alat csvsql dari suite csvkit yang menakjubkan .

Contoh penggunaan:

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

Alat ini dapat secara otomatis menyimpulkan tipe data (perilaku default), membuat tabel dan memasukkan data ke dalam tabel yang dibuat. --overwriteOpsi dapat digunakan untuk menjatuhkan tabel jika sudah ada. --insertopsi - untuk mengisi tabel dari file.

Untuk menginstal suite

pip install csvkit

Prasyarat: python-dev , libmysqlclient-dev,MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python
ruvim
sumber
3

Cara mengimpor file csv ke tabel sql

Contoh file: Overseas_trade_indexFile CSV data

Langkah:

  1. Perlu membuat tabel untuk overseas_trade_index.

  2. Perlu membuat kolom yang terkait dengan file csv.

    Permintaan SQL:

    ( id int not null primary key auto_increment,
    series_reference varchar (60),
    period varchar (60),
    data_value decimal(60,0),
    status varchar (60),
    units varchar (60),
    magnitude int(60),
    subject text(60),
    group text(60),
    series_title_1 varchar (60),
    series_title_2 varchar (60),
    series_title_3 varchar (60),
    series_title_4 varchar (60),
    series_title_5 varchar (60),
     );
  3. Perlu menghubungkan database mysql di terminal.

    =>show databases;
    =>use database;
    =>show tables;
  4. Silakan masukkan perintah ini untuk mengimpor data csv ke tabel mysql.

    load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);
  5. Temukan data indeks perdagangan luar negeri ini di sqldatabase:

    select * from trade_index;
sivamani
sumber
2

Jika Anda menggunakan mesin windows dengan Excel spreadsheet dimuat, plugin mySql baru ke Excel sangat fenomenal. Orang-orang di Oracle benar-benar melakukan pekerjaan yang baik pada perangkat lunak itu. Anda bisa membuat koneksi database langsung dari Excel. Plugin itu akan menganalisis data Anda, dan mengatur tabel untuk Anda dalam format yang konsisten dengan data. Saya punya beberapa file csv monster data yang besar untuk dikonversi. Alat ini sangat menghemat waktu.

http://dev.mysql.com/downloads/windows/excel/

Anda bisa membuat pembaruan dari dalam Excel yang akan mengisi ke database online. Ini bekerja sangat baik dengan file mySql yang dibuat pada hosting shared GoDaddy yang sangat murah. (Catatan ketika Anda membuat tabel di GoDaddy, Anda harus memilih beberapa pengaturan yang tidak standar untuk mengaktifkan akses situs dari database ...)

Dengan plugin ini Anda memiliki interaktivitas murni antara spreadsheet XL Anda dan penyimpanan data mySql online.

zipzit
sumber
2

Saya menggunakan meja kerja mysql untuk melakukan pekerjaan yang sama.

  1. buat skema baru
  2. buka skema yang baru dibuat
  3. klik kanan pada "Tables" dan pilih "Table Import Import Wizard"
  4. berikan path file csv dan nama tabel dan akhirnya konfigurasikan tipe kolom Anda karena wizard mengatur tipe kolom default berdasarkan nilainya.

Catatan: lihat file log mysql workbench untuk setiap kesalahan dengan menggunakan "tail -f [mysqlworkbenchpath] /log/wb*.log"

Mehdi
sumber
Terima kasih banyak atas jawaban Anda - karena saya baru mengenal MySQL, saya tidak tahu tentang ini - ini membantu saya dengan CSV. Sekarang, saya juga perlu mengimpor 10 tabel dari Access - apakah Anda pikir cara paling sederhana adalah dengan mengekspor tabel ini ke Excel, dari Excel ke CSV dan kemudian menggunakan langkah-langkah ini?
Naomi
Saya menemukan bahwa metode ini tidak mengimpor semua baris :( Dari 5.342 baris, hanya mengimpor 2.485 baris untuk saya. Mengapa begitu?
Naomi
Hai Naomi, jika Anda memeriksa log mysqlworkbench itu akan menunjukkan kepada Anda mengapa ia berhenti mengimpor data. Anda mungkin memiliki beberapa nilai null atau tipe ketidakcocokan dalam file DB dan CSV Anda. Tetapi saya sangat merekomendasikan untuk mengikuti jawaban Juan (tepat setelah saya). Solusinya lebih baik dan lebih bersih dari saya.
Mehdi
1

Berikut ini contoh cuplikan layar file excel:

masukkan deskripsi gambar di sini

Simpan sebagai dan pilih .csv.

Dan Anda akan memiliki seperti yang ditunjukkan di bawah ini tangkapan layar data .csv jika Anda membuka menggunakan notepad ++ atau notepad lainnya.

masukkan deskripsi gambar di sini

Pastikan Anda menghapus tajuk dan memiliki perataan kolom di .csv seperti pada Tabel mysql. Ganti folder_name dengan nama folder Anda

LOAD DATA LOKAL
INFILI 'D: /folder_name/myfilename.csv' KE mail TABEL BIDANG YANG DIAKHIRI OLEH ',' (fname, lname, email, telepon);

Jika data besar, Anda dapat mengambil kopi dan memuatnya !.

Itu yang kamu butuhkan.

Magige Daniel
sumber
0

Permintaan PHP untuk mengimpor file csv ke database mysql

$query = <<<EOF
            LOAD DATA LOCAL INFILE '$file'
             INTO TABLE users
             FIELDS TERMINATED BY ','
             LINES TERMINATED BY '\n'
             IGNORE 1 LINES
            (name,mobile,email)
    EOF;
if (!$result = mysqli_query($this->db, $query))
   {
        exit(mysqli_error($this->db));
   }

** Contoh data file CSV **

name,mobile,email
Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus
Suwarnakumar Kanapathipillai
sumber
0

Ubah servername, nama pengguna, kata sandi, dbname, path file Anda, nama file dan bidang yang ada dalam database Anda yang ingin Anda masukkan

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "bd_dashboard";
    //For create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    $query = "LOAD DATA LOCAL INFILE 
                'C:/Users/lenovo/Desktop/my_data.csv'
                INTO TABLE test_tab
                FIELDS TERMINATED BY ','
                LINES TERMINATED BY '\n'
                IGNORE 1 LINES
                (name,mob)";
    if (!$result = mysqli_query($conn, $query)){
        echo '<script>alert("Oops... Some Error occured.");</script>';
        exit();
            //exit(mysqli_error());
       }else{
        echo '<script>alert("Data Inserted Successfully.");</script>'
       }
    ?>
Srikrushna
sumber