CSV dosyasını bir MySQL tablosuna nasıl aktarabilirim?


306

Ben bir aklı başında biçimine refactor böylece MySQL tabloya yüklemeye çalıştığım bir istemciden anormal olaylar günlüğü CSV var. CSV dosyasının her sütunu için bir alanı olan 'CSVImport' adlı bir tablo oluşturdum. CSV 99 sütun içeriyor, bu yüzden bu kendi başına yeterince zor bir işti:

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

Tabloda herhangi bir kısıtlama yoktur ve sayılar (INT ile temsil edilir), evet / hayır (BIT ile temsil edilir), fiyatlar (DECIMAL ile temsil edilir) ve metin bulanıklıkları ( TEXT tarafından temsil edilir).

Dosyaya veri yüklemeye çalıştım:

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               | 
...

Bütün masa dolu NULL.

Bence sorun metin bulanıklarının birden fazla satır içermesi ve her yeni satırın bir veri tabanına karşılık gelmesi gibi MySQL'in dosyayı ayrıştırmasıdır. Dosyayı sorunsuz bir şekilde OpenOffice'e yükleyebilirim.

Clientdata.csv dosyası 2593 satır ve 570 kayıt içerir. İlk satır sütun adları içerir. Sanırım virgülle ayrılmış ve metin görünüşte çift tırnakla ayrılmış.

GÜNCELLEME:

Şüphe duyduğunuzda kılavuzu okuyun: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

LOAD DATAOpenOffice'in çıkarım için yeterince akıllı olduğu bilgisine bazı bilgiler ekledim ve şimdi doğru sayıda kayıt yüklüyor:

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;

Ancak yine de çok sayıda tam NULLkayıt var ve yüklenen verilerin hiçbiri doğru yerde görünmüyor.


17
Ve OSX kullanıyorsanız Sequel Pro harika bir içe aktarma aracına sahip ve ÜCRETSİZ ;-)
Merrick

41
Orijinal posterin kendi sorusunu herkesten daha iyi cevaplaması benim için şaşırtıcı ... Mevcut bir SQL komutu olduğunda, birçok kullanıcı arayüzü yerine programlı olabilecek neden bu kadar çok insanın yazılım önerileri vermeye hazır olduğunu bilmiyorum. tabanlı. Başka kimseyi tanımıyorum, ancak programatik, zaman damgalarında dosyaları otomatik olarak içe aktarmak için komut dosyaları alabileceğim anlamına gelir, oysa UI tabanlı tamamen manueldir.
Chris Cirefice

@ChrisCirefice: Bence kabul edilen cevap bunu iyi açıklıyor. Grafiksel bir programın yardımcı olabileceği 'verileri yükle' komutunu manuel olarak oluşturmak için yardıma ihtiyacı vardı. Grafik program 'veri yükle' komutunu oluşturduktan sonra, programlı olarak yeniden kullanabilir.
AlexC

@Merrick bu osx üzerinde bir tedavi çalıştı
weaveoftheride

Excel'de bir sözdizimi oluşturma aracı ile birlikte mysql içine csv veri yüklemek için kapsamlı bir öğretici yazdı .
mysql_user

Yanıtlar:


133

Sorununuzun çekirdeği, CSV dosyasındaki sütunları tablodakilerle eşleştiriyor gibi görünüyor.

Birçok grafik mySQL istemcisi, bu tür şeyler için çok güzel içe aktarma iletişim kutularına sahiptir.

Bu iş için en sevdiğim Windows tabanlı HeidiSQL . LOAD DATAKomutu oluşturmak için size grafiksel bir arayüz sunar ; daha sonra programlı olarak yeniden kullanabilirsiniz.

Metin dosyasını içe aktar

Ekran görüntüsü: "Metin dosyasını içe aktar" iletişim kutusu

Metin dosyasını içe aktar "iletişim kutusunu açmak için şu adrese gidin Tools > Import CSV file:

resim açıklamasını buraya girin


25
Mac OSX için Sequel Pro'yu kullanın.
Agi Hammerthief

3
Ben sadece denedim ve sütun isimlerini kullanmak yerine ilk tablo oluşturmak ... gerektirir.
Dominique

3
Devam edebilmek için bir masa seçmelisiniz ... ve bütün mesele masayı yapmak zorunda olmadığından ...
Dominique

3
Linux'ta HeidiSQL'in Wine altında çok iyi çalıştığını unutmayın.
AlejandroVD

1
@ Cevabın asıl noktası , GUI araçlarının tablo sütunlarıyla eşleşen içe aktarma sütunlarını kolaylaştırabilmesidir.
Pekka

191

Veritabanına bir tablo yüklemek için mysqlimport kullanın :

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

Http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/ adresinde buldum.

Sınırlayıcıyı sekme yapmak için --fields-terminated-by='\t'


6
mysqlimportLOAD DATA INFILE...perde arkasında kullanır , bu yüzden hemen hemen aynı şey.
Mladen Jablanović

8
Olduğu gibi LOAD DATA INFILE, kullanabilmeniz için önce bir tablo oluşturmanız gerekir mysqlimport.
Marcus Downing

@ MladenJablanović, kesinlikle aynı şey değil. 1bil satırları içe aktarmayı deneyin. Performans açısından ne kadar büyük bir fark
yaratacağına şaşıracaksınız

@ninjabber docs diyor mysqlimport istemci Yüklemeyeİnsülin DATA INFILE için bir komut satırı arayüzü sağlayan öyledir, teorik olarak üzerinde herhangi bir performans avantajı sunuyoruz imkansız LOAD DATA INFILE.
Mladen Jablanović

1
ayrıca ihtiyaç --fields-optionally-enclosed-by=\"ve - --fields-escaped-by = \ `
chaintng

80

Ben 200 + satır ithal benim en basit yolu phpmyadmin sql penceresinde komut altında

İki sütun CountryId, CountryName ile ülkenin basit bir tablo var

İşte .csv verileriCSV DOSYASI

İşte komut:

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

Bir şeyi aklınızda bulundurun, asla görünmeyin, ikinci sütunda, aksi takdirde içe aktarmanız duracaktır


1
'' -> '\ t', '"' -> '' TSV dosya halinde ve son satırı kaldırmak hiçbir başlık (umut arama tarayıcılarının endeksi bu) eğer..
Parmaklar Kanama

16
Yerel bir dosyaysa, yapmanız gerekebilir LOAD DATA LOCAL INFILE. Bu hata 1148 "kullanılmış komut izin verilmiyor" atarsa, komut satırında mysql ile çalıştırarak etkinleştirebilirsiniz --local-infile.
Büyük McLargeHuge

hatayı aldım: HATA 1045 (28000): 'kullanıcı' @ '%' kullanıcısı için erişim reddedildi (parola kullanarak: EVET)
ARUNBALAN NV

Kullanıcıya tüm erişim izni vermelisiniz, yönetici panelinden komut dosyasını içe aktarmayı deneyin.
DareDevil

1
Bu hatayı alıyorum: MySQL sunucusu --secure-file-priv seçeneğiyle çalışıyor, bu yüzden bu ifadeyi
yürütemiyor

66

Bunu biliyorum soru eskidir , Ama istiyorum paylaşan bu

0.046 saniyede 100.000'den fazla kayıt ( ~ 5MB ) içe aktarmak için bu yöntemi kullandım

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

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

Birden fazla alanınız varsa, son satırı eklemek çok önemlidir, yani normalde son alanı atlar (MySQL 5.6.17)

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

Ardından, alanlarınızın başlığı olarak ilk satıra sahip olduğunuzu varsayarsak , bu satırı da dahil etmek isteyebilirsiniz

IGNORE 1 ROWS

Dosyanızda bir başlık satırı varsa, bu şekilde görünür.

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

16 bin satır ve 48 sütun içe aktardım. Teşekkür ederim dostum.
Renjith VR

Bu en iyi çözümdür. Bunun ne kadar hızlı olduğunu merak eden herkes için: Yerleşik MySQL sunucusuyla (yüksek performanslı RDS değil) $ 20 / ay AWS Lightsail örneğinde 14 saniyenin altında 3,2 milyon satır içe aktardım. Müthiş!
master_gracey

Bu satırda, (field_1,field_2 , field_3);bir .csv dosyasındaki veya bir tablodaki sütunlar listesine mi başvuruyor? yani, bu alanlar nedir?
tera_789

@ tera_789 csv dosyanızdaki muhtemelen masanıza uyanlar
Fahad

Veri formatına uyulmalıdır. örnek (benim durumum için) <pre> ad_adı, soyadı, dob, telefon_sayısı, e-posta, ad, soyadı, 12-05-2018,54545, faiz @ gmail.com, ad1, soyadı1,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 , CSV içe aktarmayı işleyebilir. İşte adımlar:

  1. CSV dosyasını alanların MySQL tablo alanlarıyla aynı sırada olacak şekilde hazırlayın.

  2. Başlık satırını CSV'den (varsa) kaldırın, böylece dosyada yalnızca veri olur.

  3. PhpMyAdmin arayüzüne gidin.

  4. Soldaki menüden tabloyu seçin.

  5. Üst taraftaki içe aktar düğmesini tıklayın.

  6. CSV dosyasına göz atın.

  7. "LOAD DATA kullanarak CSV" seçeneğini seçin.

  8. "İle sonlandırılmış" alanlarına "," girin.

  9. Sütun adlarını veritabanı tablosundakiyle aynı sırayla girin.

  10. Git düğmesine tıklayın ve işiniz bitti.

Bu, gelecekteki kullanımım için hazırladığım ve başka birinin yarar sağlayabileceği durumlarda paylaştığım bir not.


Bu iyi ve basit. SQL ile tablolar ve sütunlar oluşturmayı tercih ediyorum (bu yüzden Adım # 9'u atladım) ve CSV'yi içe aktararak veri eklemeyi tercih ediyorum. NULLHerhangi bir otomatik artan alan / sütun için CSV'ye ayarlamayı unutmayın .
gümüş

Utf-8 kullanmasını söylediğinizden bağımsız olarak CSV dosyasına Kiril karakterleri eklendiğinde phpMyAdmin'in perişan bir şekilde başarısız olduğunu unutmayın.
Fran Marzoa

Büyük CSV dosyasını içe aktarıyorsanız, içe aktarma boyutunu değiştirmeyi unutmayın. BTW, büyük CSV dosyaları için iyi bir seçenek değildir.
Avi

Bu, yerel bir csv dosyasına göz atamadığınız için önce .csv dosyasının bir web istemcisine indirilmesini gerektirir.
mckenzm

Evet, 'Yerel Anahtar Kelime' işaretli onay kutusunu işaretlemeniz gerekir ve yerel bir csv dosyası kullanabilirsiniz
chrisfs

12

VERİ YÜKLEME deyiminizdeki sütunları listeleyerek bunu düzeltebilirsiniz. Gönderen manuel :

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

... yani sizin durumunuzda 99 sütunu csv dosyasında göründükleri sırayla listelemeniz gerekir.


8

Bunu dene, benim için çalıştı

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

IGNORE 1 ROWS burada alan adlarını içeren ilk satırı yok sayar. Dosya adı için dosyanın mutlak yolunu yazmanız gerektiğini unutmayın.


Bu en iyi cevap. Neden tek bir SQL komutunun çalışacağı başka bir araç kullanılsın ?
sdgfsdh

U bir sunucuda çalışan mysql içine dosya yüklemeye çalışırken bu iş yapmak nasıl biliyor musunuz? Bana dosya (şifre) için reddedildiğini soruyor. CSV dosya konumunun şifresini nereye girmeliyim?
Baktaawar

7

Mysql komut satırı içe aktarmada çok fazla soruna eğilimlidir. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

  • boşluk içermeyen başlık adlarını düzenlemek için excel kullanın
  • .csv olarak kaydet
  • yeni bir tablo içe aktarmak ve otomatik olarak oluşturmak için ücretsiz Navicat Lite Sql Tarayıcı kullanın (bir ad verin)
  • yeni tabloyu aç kimlik için birincil otomatik numara sütunu ekle
  • sütunların türünü istediğiniz gibi değiştirin.
  • bitmiş!

5

MySQL Workbench (şu anda 6.3 sürümü) kullanıyorsanız, bunu şu şekilde yapabilirsiniz:

  1. "Tablolar" ı sağ tıklayın;
  2. Tablo Verilerini İçe Aktarma Sihirbazı'nı seçin;
  3. Csv dosyanızı seçin ve talimatları izleyin (JSON da kullanılabilir); İyi olan şey, mevcut bir tabloya veri aktarmak veya veri yüklemek istediğiniz csv dosyasına dayalı yeni bir tablo oluşturabilmenizdir.

resim açıklamasını buraya girin


+1. Bunu kullandım çünkü mysql bana hatalar vermeye devam etti LOAD DATA INFILEve mysqlimport("bu
mysql'in

Bu yöntem işe yarıyor, ama biraz yavaş. Bu özelliği kullanmanın büyük bir INSERTsorgu oluşturduğunu ve hepsini bir kerede yapmaya çalışacağını düşünürdüm , ancak bu şekilde yapmak aslında INSERTher satırda bir kez çalışır gibi görünüyor .
DaveTheMinion

4

Tuhaf bir şey görüyorum. KAPSAM için kullandığınız aynı karakterden KAÇIŞ için kullanıyorsunuz. Bu yüzden motor bir '' 'bulduğunda ne yapacağını bilmiyor ve bence bu yüzden doğru yerde hiçbir şey yok gibi görünüyor.

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

CSV'nizi analiz etmezseniz (manuel olarak, görsel olarak ...) ve kaçış için hangi karakterin kullanıldığını bulmazsanız. Bazen '\' olur. Ama eğer sahip değilseniz, kullanmayın.


3

Yine bir başka çözüm, şaşırtıcı csvkit paketinden csvsql aracını kullanmaktır .

Kullanım örneği:

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

Bu araç, veri türlerini (varsayılan davranış) otomatik olarak çıkartabilir, tablo oluşturabilir ve verileri oluşturulan tabloya ekleyebilir. --overwriteseçeneği zaten varsa tabloyu bırakmak için kullanılabilir. --insertseçenek - tabloyu dosyadan doldurmak için.

Paketi yüklemek için

pip install csvkit

Ön şartlar: python-dev , libmysqlclient-dev,MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python

3

Csv dosyaları sql tablolarına nasıl alınır

Örnek dosya: Overseas_trade_indexveri CSV Dosyası

Adımlar:

  1. İçin tablo oluşturmanız gerekiyor overseas_trade_index.

  2. Csv dosyasıyla ilgili sütunlar oluşturmanız gerekiyor.

    SQL Sorgusu:

    ( 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. Terminalde mysql veritabanını bağlamanız gerekir.

    =>show databases;
    =>use database;
    =>show tables;
  4. Lütfen csv verilerini mysql tablolarına aktarmak için bu komutu girin.

    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. Sqldatabase'de bu denizaşırı ticaret endeksi verilerini bulun:

    select * from trade_index;

2

Excel elektronik tablosu yüklü bir Windows makinesi kullanıyorsanız, yeni Excel için mySql eklentisi olağanüstüdür. Oracle'daki insanlar bu yazılımda gerçekten iyi bir iş çıkardılar. Veritabanı bağlantısını doğrudan Excel'den yapabilirsiniz. Bu eklenti verilerinizi analiz eder ve tabloları sizin için verilerle tutarlı bir biçimde ayarlar. Dönüştürmek için bazı canavar büyük csv veri dosyaları vardı. Bu araç büyük bir zaman tasarrufu oldu.

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

Excel içinden çevrimiçi veritabanına girecek güncelleştirmeler yapabilirsiniz. Bu ultra ucuz GoDaddy paylaşılan barındırma üzerinde oluşturulan mySql dosyaları ile son derece iyi çalıştı. (Tabloyu GoDaddy'de oluşturduğunuzda, veritabanının site dışı erişimini etkinleştirmek için bazı standart dışı ayarları seçmeniz gerektiğini unutmayın.)

Bu eklenti ile XL e-tablonuz ve çevrimiçi mySql veri depolama arasında saf etkileşime sahipsiniz.


2

Aynı işi yapmak için mysql tezgah kullanıyorum.

  1. yeni şema oluştur
  2. yeni oluşturulan şemayı aç
  3. "Tablolar" ı sağ tıklayın ve "Tablo Verilerini İçe Aktarma Sihirbazı" nı seçin
  4. csv dosya yolunu ve tablo adını verin ve son olarak sihirbaz değerlerine göre varsayılan sütun türünü ayarladığından sütun türünüzü yapılandırın.

Not: "tail -f [mysqlworkbenchpath] /log/wb*.log" kullanarak herhangi bir hata için mysql çalışma tezgahının günlük dosyasına bir göz atın


Cevabınız için çok teşekkürler - MySQL'de yeni olduğumu bilmiyordum - bu bana CSV ile yardımcı oldu. Şimdi, Access'ten 10 tablo içe aktarmam gerekiyor - en basit yolun bu tabloları Excel'e, Excel'den CSV'ye aktarmak ve sonra bu adımları kullanmak olacak mı?
Naomi

Bu yöntemin tüm satırları almadığını fark ettim :( 5.342 satırdan sadece 2.485 satırı benim için içeri aktardı Neden?
Naomi

Hey Naomi, mysqlworkbench günlüğünü kontrol ederseniz neden veri almayı bıraktığını gösterecektir. DB ve CSV dosyanızda bazı boş değerler veya uyumsuzluk türü olabilir. Ama Juan'ın cevabını takip etmenizi şiddetle tavsiye ediyorum (hemen arkamdan). Onun çözümü benden daha iyi ve temiz.
Mehdi

1

İşte örnek excel dosyası ekran görüntüsü:

resim açıklamasını buraya girin

Farklı kaydedin ve .csv dosyasını seçin.

Notepad ++ veya başka bir not defteri kullanarak açarsanız, aşağıda gösterildiği gibi .csv veri ekran görüntüsü olacaktır.

resim açıklamasını buraya girin

Üstbilgiyi kaldırdığınızdan ve mysql tablosunda olduğu gibi .csv dosyasında sütun hizalamasına sahip olduğunuzdan emin olun. Klasör_adı yerine klasör adınızı yazın

VERİ YEREL
DOSYASI YÜKLE 'D: /folder_name/myfilename.csv' SONLANDIRILAN TABLO posta ALANLARINA ',' (fname, lname, e-posta, telefon);

Büyük veri varsa, kahve alabilir ve yükleyebilirsiniz !.

Tüm ihtiyacın olan bu.



0

Mysql veritabanına csv dosyasını almak için PHP Sorgulama

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

** Örnek CSV dosyası verileri **

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

0

Sunucuadı, kullanıcı adı, şifre, dbname, dosyanızın yolunu, tablename ve veritabanınıza eklemek istediğiniz alanı değiştirin

<?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>'
       }
    ?>
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.