CSV'yi mysql tablosuna aktar


96

Bir csv dosyasını bir mysql tablosuna yüklemenin en iyi / en hızlı yolu nedir? Verinin ilk satırının sütun adları olarak kullanılmasını istiyorum.

Bunu buldum:

CSV dosyası MySQL tablosuna nasıl alınır

Ancak tek cevap bir GUI kullanmaktı, kabuk değil?


3
Ve GUI çözümü bile sütun adlarını csv'den almıyor ... içe aktarmadan önce tüm tabloyu oluşturmanız
Dominique

Sorunun zaten burada bir cevabı var stackoverflow.com/questions/3635166/…
David

Bağlandığınız sorunun cevabı bir GUI kullanıyordu. Referans
verdiğiniz

Yanıtlar:


147

Bir CSV dosyasından bilgi almak için bir komut dosyası yazmak yerine, MYSQL'i doğrudan ona bağlayabilir ve aşağıdaki SQL sözdizimini kullanarak bilgileri yükleyebilirsiniz.

Bir Excel dosyasını MySQL'e aktarmak için önce onu bir CSV dosyası olarak dışa aktarın. Oluşturulan CSV dosyasından CSV başlıklarını, Excel'in CSV dosyasının sonuna koymuş olabileceği boş verilerle birlikte kaldırın.

Daha sonra şunu çalıştırarak bir MySQL tablosuna aktarabilirsiniz:

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

okunduğu gibi: CSV dosyasını doğrudan MySQL'e aktarın

DÜZENLE

Durumunuz için, ilk satırı bulmak ve bunları sütun adları olarak atamak için önce bir yorumlayıcı yazmanız gerekir.


DÜZENLEME-2

MySQL Dokümanlar üzerinde LOAD DATAsöz dizimi :

IGNORE number LINESOpsiyon dosyasının başında çizgilerini görmezden kullanılabilir. Örneğin, IGNORE 1 LINESsütun adlarını içeren bir başlangıç ​​başlık satırını atlamak için kullanabilirsiniz :

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

Bu nedenle, aşağıdaki ifadeyi kullanabilirsiniz:

LOAD DATA LOCAL INFILE 'uniq.csv'
INTO TABLE tblUniq
FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(uniqName, uniqCity, uniqComments)

8
İlk satırı kaldırmak yerine IGNORE 1 LINESsorguya ekleyebilirsiniz
mb14

Dosya yolunu csv dosyasına ayarlamanın bir yolu olup olmadığını biliyor musunuz?
JasonDavis

Başarısız olduğunda bu komut nasıl hata ayıklanır? Bu komutla bir dosya yüklemeye çalışıyorum ama hiçbir şey yapmıyor.

1
csv'deki bir sütunu yok saymak istersem nasıl olur?
Marci-man

csv yerel dosyama aws (rds) üzerinde çalışan mysql sunucusu tarafından erişilmesine nasıl izin verilir
rahul

24

İşte ihtiyacınız olanı yapacak basit bir PHP komut satırı betiği:

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

?>

İlk satıra göre bir tablo oluşturacak ve kalan satırları buna aktaracaktır. Komut satırı sözdizimi şöyledir:

php csv_import.php csv_file.csv table_name

2
Harika senaryo. Çift tırnaklı CSV dosyalarına sahip olanlar için (çoğu insanı oku) için `` ENCASED IN '\ "' 'ekleyin fields terminated by ','... kısmen çift tırnaklı CSV'lerle bile işe yarıyor.
Joel Mellon

3
Sanırım şunu demek istiyorsun ENCLOSED BY '\"'... ayrıca, LINES TERMINATED BY '\r\n'Windows'tan bir CSV kullanılıyorsa pek çok kişiye ihtiyaç duyacak . Ve son olarak, boşluk olması durumunda alan adlarından ters işaretlerle kaçmak akıllıca olacaktır:$columns .= "`$column` varchar(250)";
dlo

1
Bu cevap, kabul edilen cevaptan çok daha iyidir. Özellikle OP'nin istediği şeye izin veriyor ve ben de şunu istiyorum: "verilerin ilk satırı sütun adları olarak kullanılsın". (Python'da bir komut dosyası tercih ederim, bu yüzden PHP'yi yüklemem gerekmiyor, ancak onu taşımak zor olmamalı.)
LarsH

2
@YumYumYum Yaşadığınız sorun hakkında daha fazla ayrıntı verebilir misiniz?
Hawkee

Sana bir bira ısmarlayabilir miyim?
Joe

4

phpadmin'i yükleyebiliyorsanız, csv dosyalarını veritabanınıza içe aktarabileceğiniz bir içe aktarma bölümü vardır, üstbilgiyi dosyanın ilk satırına ayarlamak için bir onay kutusu bile vardır, tablo sütun adlarını içerir (bu işaretli değilse, ilk satır verilerin bir parçası olacak


Bu işlevi elde etmek için phpadmin gibi bir eklenti kullanmanız gerektiğine gerçekten şaşırdım, Cevabınız için teşekkürler
chrisfs

Bu günümü yeni
Mark

4

Öncelikle veritabanında csv dosyasında bulunan aynı sayıda sütuna sahip bir tablo oluşturun.

Ardından aşağıdaki sorguyu kullanın

LOAD DATA INFILE 'D:/Projects/testImport.csv' INTO TABLE cardinfo
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'

csv'deki bir sütunu yok saymak istersem nasıl olur?
Marci-man

3

Metin dosyasından veya csv dosyasından veri yüklemek için komut şudur:

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

Yukarıdaki komutta, benim durumumda yüklenecek sadece bir sütun var, bu yüzden "sonlandırılan" ve "içine alınan" yok, bu yüzden boş bıraktım, yoksa programcı ayırma karakterini girebilir. örneğin. , (virgül) veya "veya; veya herhangi bir şey.

** mysql sürüm 5 ve üstünü kullananlar için **

Dosyayı mysql'e yüklemeden önce, aşağıdaki çekme hattının yan tarafa eklendiğinden emin olmalısınız. etc/mysql/my.cnf

my.cnf komutunu düzenlemek için

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  

3

Mysql'i "mysql -u -p --local-infile" olarak başlatırsanız, sorunsuz çalışır.


2

Bunu yapmak için bazı kodlar yazdım, birkaç parçacık ekleyeceğim:

$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

Ardından, mysql'e nasıl içe aktarılacağını söyleyebilmek için CSV başlıklarını alın (not: mysql sütunlarınızın csv sütunlarıyla tam olarak eşleştiğinden emin olun):

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

Ardından sorgunuzu mysql sunucusuna gönderin:

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

1

Bir süre bununla boğuştum. Sorun, verilerin nasıl yükleneceği değil, tablonun tutulacak şekilde nasıl oluşturulacağıdır. Verileri içe aktarmadan önce tabloyu oluşturmak için bir DDL ifadesi oluşturmalısınız.

Tabloda çok sayıda sütun varsa özellikle zordur.

İşte (neredeyse) işi yapan bir python betiği:

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

Çözmesi gereken sorun, son alan adı ve veri türü bildiriminin virgülle sonlandırılması ve mySQL ayrıştırıcısının buna tolerans göstermemesidir.

Elbette her alan için TEXT veri türünü kullanma sorunu da var. Tabloda birkaç yüz sütun varsa, VARCHAR (64) tabloyu çok büyük yapacaktır.

Bu da mySQL için maksimum sütun sayısında kırılıyor gibi görünüyor. Mümkünse, Hive veya HBase'e geçme zamanı geldi.


1

Python'da csv ve MySQL Bağlayıcısı kullanarak bunu şu şekilde yaptım :

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

Anahtar noktaları

  • INSERT için hazırlanmış ifadeleri kullanın
  • File.csv dosyasını 'rb'ikili olarak açın
  • Bu seçenek gibi bazı CSV dosyalarının ince ayarlanması gerekebilir skipinitialspace.
  • Eğer 255yeterince geniş olduğunu sen INSERT hataları almak ve baştan başlamak gerekir.
  • Sütun türlerini ayarlayın, örneğin ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • Bir birincil anahtar ekleyin , ör.ALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

0

CSV Dosyalarını mysql tablosuna aktarın

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

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


0

Diğerlerinin de belirttiği gibi, yerel veri yükleme dosyası gayet iyi çalışıyor. Hawkee'nin gönderdiği php komut dosyasını denedim, ancak benim için çalışmadı. Hata ayıklamak yerine, işte yaptığım şey:

1) CSV dosyasının başlık satırını bir txt dosyasına kopyalayın / yapıştırın ve emacs ile düzenleyin. Her alanı kendi satırında görmek için her alanın arasına virgül ve CR ekleyin.
2) Bu dosyayı FieldList.txt olarak kaydedin
3) dosyayı her alan için defn'leri içerecek şekilde düzenleyin (çoğu varchar'dı, ancak pek çoğu int (x) idi. Create table tablename (dosyanın başlangıcına ve) Dosyanın sonuna kaydedin. CreateTable.sql olarak kaydedin
4) tabloyu oluşturmak için Createtable.sql dosyasından gelen girdiyle
mysql istemcisini başlatın 5) mysql istemcisini başlatın, 'LOAD DATA INFILE' komutunun çoğunu kopyalayıp yapıştırarak tablomu değiştirin adı ve csv dosya adı. FieldList.txt dosyasına yapıştırın. Alan listesine yapıştırmadan önce '1 HATTI YOK ETMEYİ' eklediğinizden emin olun.

Çok iş gibi geliyor ama emacs ile kolay .....


0

TablePlus uygulamasını kullanın: Sağ panelden tablo adına sağ tıklayın İçe Aktar ...> CSV'den CSV dosyası seçin Sütun eşleşmesini gözden geçirin ve İçe Aktar seçeneğini tıklayın.


-3

Google arama, csv'yi mysql'ye aktarmanın birçok yolunu kullanıyorum, "veri dosyası yükle", mysql tezgahını kullan, vb.

mysql workbench import butonunu kullandığımda, önce boş tabloyu kendiniz oluşturmanız, her bir sütun tipini kendiniz ayarlamanız gerekiyor. Not: null ve auto_increment değil, birincil anahtar olarak sonuna ID sütunu eklemeniz gerekir, aksi takdirde, içe aktarma düğmesi daha sonra görünmez. Ancak, CSV dosyasını yüklemeye başladığımda, hiçbir şey yüklenmedi, bir hata gibi görünüyor. Pes ediyorum.

Şanslı, şu ana kadar bulduğum en kolay yol Oracle'ın mysql'sini excel için kullanmak. buradan excel için mysql indirebilirsiniz

Yapacağınız şey şudur: csv dosyasını excel'de açın, Veri sekmesinde, excel için mysql bulun düğmesi

tüm verileri seçin, mysql'ye aktar'a tıklayın. Bir kimlik sütununu birincil anahtar olarak ayarlamaya dikkat edin.

Bittiğinde, düzenli kullanım için büyük miktarda ondalık (10,2) için para birimi türünün ondalık (19,4) olması gerektiği gibi tabloyu değiştirmek için mysql çalışma tezgahına gidin. diğer alan türü varchar (255) olarak ayarlanabilir.

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.