LOAD DATA INFILE kullanarak MYSQL csv'den veri içe aktarma


106

20000 satırlık bazı verileri bir CSV dosyasından Mysql'e aktarıyorum.

CSV'deki sütunlar MySQL tablosunun sütunlarından farklı bir sıradadır. Mysql tablo sütunlarına karşılık gelen sütunlar otomatik olarak nasıl atanır?

Yürüttüğümde

LOAD DATA INFILE'abc.csv' INTO TABLE abc

bu sorgu tüm verileri ilk sütuna ekler.

Lütfen verileri Mysql'e aktarmak için otomatik sözdizimi önerin.



Başıma geldi, metin dosyasının '\ r' ile sonlandırılan satırlarla yazıldığını öğrendim ve satırların sonlandırılmasını bekleyerek veriyi '\ n'
Tamer

2
Excel'de bir sözdizimi oluşturucu aracıyla birlikte csv verilerini mysql'ye yüklemek için kapsamlı bir eğitim yazdım . Okuyucular için faydalı olmalı.
mysql_user

Yanıtlar:


170

Csv dosyasını tabloya aktarmak için LOAD DATA INFILE komutunu kullanabilirsiniz .

Bu bağlantıyı kontrol edin 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...);

MySQL 8.0 kullanıcıları için:

LOCALAnahtar kelimeyi kullanmak güvenlik risklerini korur ve MySQL 8.0'dan itibaren bu LOCALözellik Falsevarsayılan olarak ayarlanır . Şu hatayı görebilirsiniz:

HATA 1148: Kullanılan komuta bu MySQL sürümünde izin verilmiyor

Dokümanlardaki talimatları izleyerek üzerine yazabilirsiniz . Bu tür bir üzerine yazma işleminin güvenlik sorununu çözmediğine, bunun yerine sadece risk almaya istekli ve farkında olduğunuzu kabul ettiğinize dikkat edin.


1
IGNORE 1 LINESBurada tam olarak ne yaptığını öğrenebilir miyim ? Şimdiden teşekkürler.
Koushik Das

5
@KoushikDas Sütun adlarını tanımlayan ilk satırı yok sayacak
Saharsh Shah

28
dikkat: LINES TERMINATED BY '\ r \ n' yan tümcesi Windows dosyaları için çalışır, ancak linux dosyalarında yalnızca '\ n' bulunmalıdır.
ChuckCottrill

1
Eğik çizgi kullanmayı unutmamak önemlidir: stackoverflow.com/a/42878067/470749
Ryan,

3
sadece (col1, col2, col3 ....) gerekli olmadığına dikkat edin. Veri eklemek için bunu kullanmadan önce anında bir tablo oluşturuyorsanız kullanışlıdır.
Kieran Quinn

51

Muhtemelen FIELDS TERMINATED BY ','veya sınırlayıcı ne olursa olsun ayarlamanız gerekir.

Bir CSV dosyası için, ifadeniz şöyle görünmelidir:

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

1
VERİ YEREL BİLGİSAYARINI YÜKLE ... YEREL olmadan erişim reddedildi.
ketankk

49

Dosyayı içe aktarmadan önce aşağıdakileri hazırlamanız gerekir:

  • Dosyadaki verilerin aktarılacağı bir veritabanı tablosu.
  • Tablonun sütun sayısı ve her sütundaki veri türüyle eşleşen verileri içeren bir CSV dosyası.
  • MySQL veritabanı sunucusuna bağlanan hesap, FILE ve INSERT ayrıcalıklarına sahiptir.

Aşağıdaki tabloya sahip olduğumuzu varsayalım:

görüntü açıklamasını buraya girin

AŞAĞIDAKİ SORGUYU KULLANARAK TABLO OLUŞTUR:

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 DOSYANIZ EKLENEN AŞAĞIDAKİ RESMİ GÖRMEK İÇİN UYGUN ŞEKİLDE BİÇİMLENDİRİLMELİDİR:

görüntü açıklamasını buraya girin

Her şey yolundaysa .. Lütfen CSV DOSYASINDAN VERİ YÜKLEMEK için aşağıdaki sorguyu yürütün:

NOT: Lütfen CSV dosyanızın mutlak yolunu ekleyin

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

Her şey bittiyse. verileri CSV'den tabloya başarıyla aktardınız


CSV dosyasının her sütun için uygun veri türüne sahip olup olmadığını nasıl doğrulayabiliriz çünkü varsayılan olarak geçersiz veri türünü yok sayar.
Umar Abbas

2
Bu kadar eski bir cevap için rahatsız ettiğim için üzgünüm. Çok inandırıcı ama bazı alanları nasıl atlayabilirim. Diyelim ki tablomda projectId, surveyId ve dateTime var, "görünümler" alanını nasıl atlayabilirim?
Danish Ansari

@MD Danish Ansari, Eski bir soruyu yanıtladığım için üzgünüz, ancak tablo sütunlarını belirtebilirsiniz. İlk alanı (bir otomatik artış birincil anahtarı) ve birkaç diğer alanı atlamam gereken yerde aşağıdakileri yaptım: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'TABLO İÇİ my_log_tbl TARAFINDAN SONLANDIRILAN ALANLAR', 'KAPSAYAN' "'SONLANDIRILAN HATLAR (UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); Sütunların şu öğeden sonra gelmesi gerektiğini düşünmüştüm masa adı, ancak bu işe yaramadı. Sonunda görünmeleri gerekir.
kalinma

17

Sözdizimi:

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

Bu Örneğe bakın:

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

Veritabanına 1 dakikada 7000000'den fazla kayıt ekleyin (hesaplama ile süper hızlı sorgu)

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 ve RRP_nl ve RRP_bl csv'de değil ama bunu hesapladık ve sonra ekledik.


2

LOAD DATA LOCAL INFILEWindows kabuğundan çalıştırıyorsanız ve kullanmanız gerekiyorsa OPTIONALLY ENCLOSED BY '"', karakterlerden doğru şekilde çıkış yapmak için buna benzer bir şey yapmanız gerekecektir:

"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 ve phpmyadmin kullandığınızı varsayalım

dosya adınız 'rating.txt' tablo adı 'derecelendirmeler' ve veritabanı adı 'filmler' var

xampp'iniz "C: \ xampp \" dizinine kuruluysa

"rating.txt" dosyanızı "C: \ xampp \ mysql \ data \ movies" klasörüne kopyalayın

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

Bunu localhost'ta yapıyorsanız bu, hatanızı atlamanıza yardımcı olabilir.


0

Bir csv veya metin dosyasından veri yükleyebilirsiniz. Bir tablodaki kayıtları içeren bir metin dosyanız varsa, bu kayıtları tabloya yükleyebilirsiniz. Örneğin, her satırın her sütun için değerleri içeren bir kayıt olduğu bir metin dosyanız varsa, kayıtları bu şekilde yükleyebilirsiniz.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

- windows üzerinde örnek

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

0

Hata Kodu: 1290 alıyordum. MySQL sunucusu --secure-file-priv seçeneğiyle çalışıyor, bu nedenle bu ifadeyi çalıştıramıyor

Bu, wampserver 3.0.6 64bit kullanarak Windows 8.1 64 bit'te benim için çalıştı.

My.ini dosyası C: \ wamp64 \ bin \ mysql \ mysql5.7.14'ten düzenlendi

Secure_file_priv c: \ wamp64 \ tmp \ girişini silin (veya burada hangi dizine sahipseniz)

Her şeyi durdurdu - wamp'tan vb. - ve her şeyi yeniden başlattı; sonra cvs dosyamı C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur üzerine punt (son dizin, veritabanı adımdır)

LOAD DATA INFILE 'myfile.csv' yürütüldü

TABLO mezunları

',' TARAFINDAN SONLANDIRILAN ALANLAR

TARAFINDAN ÇEVRELENEN '"'

'\ R \ n' TARAFINDAN SONLANDIRILAN HATLAR

1 HATTI YOKTUR

... ve SES !!!


0

Şu şekilde eklemeyi deneyebilirsiniz:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.