MYSQL mengimpor data dari csv menggunakan LOAD DATA INFILE

106

Saya mengimpor beberapa data dari 20000 baris dari file CSV ke Mysql.

Kolom di CSV memiliki urutan yang berbeda dari kolom tabel MySQL. Bagaimana cara menetapkan kolom secara otomatis sesuai dengan kolom tabel Mysql?

Saat saya mengeksekusi

LOAD DATA INFILE'abc.csv' INTO TABLE abc

kueri ini menambahkan semua data ke kolom pertama.

Mohon sarankan sintaks otomatis untuk mengimpor data ke Mysql.

MANJEET
sumber
Itu terjadi pada saya, saya menemukan bahwa file teks ditulis dengan garis yang diakhiri oleh '\ r' dan saya mencoba mengimpor data yang mengharapkan garis akan diakhiri menggunakan '\ n'
Tamer
2
Saya menulis tutorial ekstensif untuk memuat data csv ke mysql bersama dengan alat generator sintaks di Excel . Ini harus bermanfaat bagi pembaca.
mysql_user

Jawaban:

169

Anda dapat menggunakan perintah LOAD DATA INFILE untuk mengimpor file csv ke dalam tabel.

Periksa tautan ini MySQL - LOAD DATA 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...);

Untuk pengguna MySQL 8.0:

Menggunakan LOCALkata kunci memiliki risiko keamanan dan pada MySQL 8.0 LOCALkemampuan tersebut diatur ke Falsedefault. Anda mungkin melihat kesalahan:

ERROR 1148: Perintah yang digunakan tidak diizinkan dengan versi MySQL ini

Anda dapat menimpanya dengan mengikuti petunjuk di dokumen . Berhati-hatilah karena penimpaan tersebut tidak menyelesaikan masalah keamanan, melainkan hanya pengakuan bahwa Anda sadar dan bersedia mengambil risiko.

Saharsh Shah
sumber
1
Bolehkah saya tahu IGNORE 1 LINESpersis apa yang dilakukan di sini? Terima kasih sebelumnya.
Koushik Das
5
@KikDas Ini akan mengabaikan baris pertama yang mendefinisikan nama kolom
Saharsh Shah
28
PERHATIAN: klausa LINES TERMINATED BY '\ r \ n' berfungsi untuk file windows, tetapi file linux hanya boleh memiliki '\ n'.
ChuckCottrill
1
Penting untuk diingat untuk menggunakan garis miring ke depan: stackoverflow.com/a/42878067/470749
Ryan
3
hanya perhatikan bahwa (col1, col2, col3 ....) tidak diperlukan. Berguna jika Anda membuat tabel dengan cepat sebelum menggunakan ini untuk memasukkan data.
Kieran Quinn
51

Anda mungkin perlu menyetel FIELDS TERMINATED BY ','atau apa pun pembatasnya.

Untuk file CSV, pernyataan Anda akan terlihat seperti ini:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
ckim
sumber
1
LOAD DATA LOCAL INFILE ... Tanpa LOCAL, akses ditolak.
ketankk
49

Sebelum mengimpor file, Anda harus menyiapkan hal berikut:

  • Tabel database tempat data dari file akan diimpor.
  • File CSV dengan data yang sesuai dengan jumlah kolom tabel dan tipe data di setiap kolom.
  • Akun, yang terhubung ke server database MySQL, memiliki hak akses FILE dan INSERT.

Misalkan kita memiliki tabel berikut:

masukkan deskripsi gambar di sini

BUAT TABEL MENGGUNAKAN QUERY BERIKUT:

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

FILE CSV ANDA HARUS DIformat DENGAN BENAR UNTUK CONTOH LIHAT GAMBAR TERLAMPIR:

masukkan deskripsi gambar di sini

Jika semuanya baik-baik saja .. Silakan jalankan kueri berikut untuk MEMBUAT DATA DARI FILE CSV:

CATATAN: Harap tambahkan jalur absolut file CSV Anda

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Jika semuanya sudah selesai. Anda telah berhasil mengekspor data dari CSV ke tabel

SM cerah
sumber
Bagaimana kita bisa memvalidasi jika file CSV memiliki tipe data yang tepat untuk setiap kolom karena secara default mengabaikan tipe data yang tidak valid.
Umar Abbas
2
Maaf mengganggu jawaban lama seperti itu. Ini sangat meyakinkan tetapi bagaimana saya bisa melewati beberapa bidang. Misalkan tabel saya memiliki projectId, surveyId, dan dateTime, bagaimana cara melewati kolom "views"?
Danish Ansari
@MD Danish Ansari, Maaf menjawab pertanyaan lama, tetapi Anda dapat menentukan kolom tabel. Saya melakukan hal berikut, di mana saya harus melewati bidang pertama (kunci utama autoincrement), serta beberapa bidang lainnya: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'INTO TABLE my_log_tbl FIELDS DIMINATED BY', 'ENCLOSED BY' "'LINES TERMINATED BY' \ r \ n '(UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); Saya pikir kolom harus muncul setelah nama tabel, tapi itu tidak berhasil. Mereka akan muncul di akhir
kalinma
17

Sintaksis:

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}]

Lihat Contoh ini:

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;
Md. Nashir Uddin
sumber
10

Masukkan lebih dari 7000000 catatan massal dalam 1 menit dalam database (kueri super cepat dengan perhitungan)

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 dan RRP_nl dan RRP_bl tidak ada di csv tetapi kami menghitungnya dan setelah memasukkannya.

krunal panchal
sumber
2

Jika Anda menjalankan LOAD DATA LOCAL INFILEdari shell windows, dan Anda perlu menggunakan OPTIONALLY ENCLOSED BY '"', Anda harus melakukan sesuatu seperti ini untuk keluar dari karakter dengan benar:

"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
Kikoz
sumber
2

misalkan Anda menggunakan xampp dan phpmyadmin

Anda memiliki nama file 'peringkat.txt' nama tabel 'peringkat' dan nama database 'film'

jika xampp Anda diinstal di "C: \ xampp \"

salin file "rating.txt" Anda di folder "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;

Semoga ini dapat membantu Anda menghilangkan kesalahan Anda jika Anda melakukan ini di localhost

Mohammad Arshi
sumber
0

Anda dapat memuat data dari file csv atau teks. Jika Anda memiliki file teks dengan rekaman dari tabel, Anda bisa memuat rekaman tersebut di dalam tabel. Misalnya jika Anda memiliki file teks, di mana setiap baris adalah catatan dengan nilai untuk setiap kolom, Anda dapat memuat catatan dengan cara ini.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

--contoh di jendela

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 
Jorge T
sumber
0

Saya mendapatkan Kode Kesalahan: 1290. Server MySQL berjalan dengan opsi --secure-file-priv sehingga tidak dapat menjalankan pernyataan ini

Ini bekerja untuk saya di windows 8.1 64 bit menggunakan wampserver 3.0.6 64bit.

Mengedit file my.ini dari C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Hapus entri secure_file_priv c: \ wamp64 \ tmp \ (atau direktori apa pun yang Anda miliki di sini)

Menghentikan semuanya -keluar wamp dll- dan memulai kembali semuanya; kemudian punt file cvs saya di C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (direktori terakhir adalah nama database saya)

dieksekusi LOAD DATA INFILE 'myfile.csv'

Ke dalam tabel alumnos

FIELDS DIHENTIKAN OLEH ','

DITUTUP OLEH '"'

GARIS DIHENTIKAN OLEH '\ r \ n'

ABAIKAN 1 BARIS

... dan VOILA !!!

Carlos Garcia
sumber
0

Anda dapat mencoba memasukkan seperti ini:

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

Pada hari-hari ini (akhir 2019) saya lebih suka menggunakan alat seperti http://www.convertcsv.com/csv-to-sql.htm Saya Anda mendapat banyak baris Anda dapat menjalankan blok yang dipartisi menyimpan kesalahan pengguna saat csv berasal spreadsheet pengguna akhir.

Jonathan Perrotta
sumber