Імпортуйте CSV до таблиці mysql


96

Який найкращий / найшвидший спосіб завантажити файл CSV у таблицю MySQL? Я хотів би, щоб перший рядок даних використовувався як імена стовпців.

Знайшов це:

Як імпортувати файл CSV до таблиці MySQL

Але єдиною відповіддю було використання графічного інтерфейсу, а не оболонки?


3
І навіть рішення графічного інтерфейсу не бере імен стовпців з csv ... вам потрібно створити всю таблицю перед імпортом
Домінік

На запитання вже є відповідь тут stackoverflow.com/questions/3635166/…
Девід

відповідь, прийнята на запитання, на яке ви посилаєтесь, була за допомогою графічного інтерфейсу користувача. Відповідь, на яку ви посилаєтесь, була надана вчора, тоді як це запитання (відповідь) з 2012 року.
lcm

Відповіді:


147

Замість того, щоб писати сценарій для отримання інформації з файлу CSV, ви можете зв’язати MYSQL безпосередньо з ним і завантажити інформацію, використовуючи наступний синтаксис SQL.

Щоб імпортувати файл Excel у MySQL, спочатку експортуйте його як файл CSV. Видаліть заголовки CSV із згенерованого файлу CSV разом із порожніми даними, які Excel міг розмістити в кінці файлу CSV.

Потім ви можете імпортувати його в таблицю MySQL, запустивши:

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

як читаємо далі: Імпортуйте файл CSV безпосередньо в MySQL

EDIT

Для вашого випадку вам потрібно буде спочатку написати інтерпретатор, щоб знайти перший рядок і призначити їх як імена стовпців.


РЕДАКТУВАТИ-2

З документів MySQL щодо LOAD DATAсинтаксису :

IGNORE number LINESВаріант можна використовувати , щоб ігнорувати рядки на початку файлу. Наприклад, ви можете використовувати, IGNORE 1 LINESщоб пропустити початковий рядок заголовка, що містить імена стовпців:

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

Отже, ви можете використовувати наступне твердження:

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
Замість видалення першого рядка ви можете додати IGNORE 1 LINESдо запиту
mb14

Чи знаєте ви, чи є спосіб встановити шлях до файлу csv?
JasonDavis

Як налагодити цю команду, коли вона не працює? Я намагаюся завантажити файл за допомогою цієї команди, але він нічого не робить.

як щодо того, якби я хотів проігнорувати стовпець у csv?
Marci-man

як дати дозвіл на доступ до мого локального файлу csv через сервер mysql, що працює на aws (rds)
rahul

24

Ось простий скрипт командного рядка PHP, який зробить те, що вам потрібно:

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

?>

Він створить таблицю на основі першого рядка та імпортує в неї решту рядків. Ось синтаксис командного рядка:

php csv_import.php csv_file.csv table_name

2
Чудовий сценарій. Для тих, у кого є файли CSV із подвійним цитуванням (читайте у більшості людей), додайте `` ENCASED IN '' "в fields terminated by ','... це працює навіть із частково CSV-файлами з подвійним цитуванням.
Джоел Меллон,

3
Я думаю, ви маєте на увазі ENCLOSED BY '\"'... також багатьом людям знадобиться LINES TERMINATED BY '\r\n'використання CSV із Windows. І нарешті, уникати назв полів зворотними позначками є розумним на випадок, якщо є пробіли:$columns .= "`$column` varchar(250)";
dlo

1
Ця відповідь набагато краща за прийняту відповідь. Зокрема, це дозволяє те, про що просив ОП, і я також хочу: "перший рядок даних використовувати як імена стовпців". (Я віддав би перевагу сценарію на Python, тому мені не потрібно встановлювати PHP, але
перенесення

2
@YumYumYum Чи можете ви детальніше розказати про свою проблему?
Хокі

Чи можу я купити тобі пива?
Джо

4

якщо у вас є можливість встановити phpadmin, є розділ імпорту, куди ви можете імпортувати CSV-файли у свою базу даних, є навіть прапорець для встановлення заголовка в перший рядок файлу, що містить імена стовпців таблиці (якщо це не позначено, перший рядок стане частиною даних


Я справді здивований, що для отримання цієї функціональності вам потрібно використовувати надбудову на зразок phpadmin. Дякую за вашу відповідь
chrisfs

Це тільки що зробило мій день
Марк

4

Спочатку створіть таблицю в базі даних із такою ж кількістю стовпців, що і у файлі csv.

Потім використовуйте наступний запит

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

як щодо того, якби я хотів проігнорувати стовпець у csv?
Marci-man

3

Для завантаження даних із текстового файлу або файлу CSV виконується команда

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

У наведеній вище команді в моєму випадку завантажується лише один стовпець, тому немає "закінчується" та "вмикається", тому я залишив його порожнім, інакше програміст може ввести розділовий символ. наприклад, , (кома) або "або; або будь-яка річ.

** для людей, які використовують mysql версії 5 і вище **

Перш ніж завантажувати файл у mysql, переконайтеся, що внизу додано буксирний рядок etc/mysql/my.cnf

для редагування команди my.cnf є

sudo vi /etc/mysql/my.cnf

[mysqld]  
local-infile

[mysql]  
local-infile  


2

Я написав код, щоб зробити це, я розміщу кілька фрагментів:

$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

Потім отримайте заголовки CSV, щоб ви могли повідомити mysql, як імпортувати (примітка: переконайтеся, що ваші стовпці mysql точно відповідають стовпцям csv):

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

Потім надішліть свій запит на сервер mysql:

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

Я певний час боровся з цим. Проблема полягає не в тому, як завантажити дані, а в тому, як побудувати таблицю для їх утримання. Ви повинні створити оператор DDL для побудови таблиці перед імпортом даних.

Особливо складно, якщо таблиця має велику кількість стовпців.

Ось сценарій python, який (майже) виконує цю роботу:

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

Проблема, яку вона залишає вирішити, полягає в тому, що остаточне ім'я поля та оголошення типу даних припиняються комою, і синтаксичний аналізатор mySQL цього не терпить.

Звичайно, проблема також полягає в тому, що він використовує тип даних TEXT для кожного поля. Якщо таблиця має кілька сотень стовпців, то VARCHAR (64) зробить таблицю занадто великою.

Здається, це також порушує максимальну кількість стовпців для MySQL. Саме тоді настав час переїхати до Hive або HBase, якщо це можливо.


1

Ось як я це зробив у Python, використовуючи csv та MySQL Connector :

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

Ключові моменти

  • Використовуйте підготовлені твердження для INSERT
  • Відкрийте файл.csv у 'rb'двійковому вигляді
  • Деякі файли CSV можуть потребувати доопрацювання , наприклад skipinitialspaceопції.
  • Якщо 255він недостатньо широкий, ви отримаєте помилки на INSERT і доведеться починати спочатку.
  • Налаштування типів стовпців, наприклад ALTER TABLE t MODIFY `Amount` DECIMAL(11,2);
  • Додайте первинний ключ , наприкладALTER TABLE t ADD `id` INT PRIMARY KEY AUTO_INCREMENT;

0

Імпортуйте файли CSV у таблицю mysql

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

відвідування: http://www.webslessons.com/2014/02/import-csv-files-using-php-and-mysql.html


0

Як вже згадували інші, локальний файл даних завантаження працює нормально. Я спробував PHP-скрипт, який Хокі розмістив, але не працював для мене. Замість налагодження, ось що я зробив:

1) скопіюйте / вставте рядок заголовка файлу CSV у файл txt та відредагуйте за допомогою emacs. додайте кому і CR між кожним полем, щоб кожне потрапило на свій рядок.
2) Збережіть цей файл як FieldList.txt
3) відредагуйте файл, щоб включити defns для кожного поля (більшість з них були varchar, але досить багато були int (x). Додайте create table tablename (до початку файлу та) до Збережіть його як CreateTable.sql
4) запустіть клієнт mysql із введенням з файлу Createtable.sql для створення таблиці
5) запустіть клієнт mysql, скопіюйте / вставте більшу частину команди 'ЗАГРУЗИТИ ДАНІ ІНФАЙЛ', замінивши мою таблицю ім'я та ім'я файлу CSV. Вставте у файл FieldList.txt. Не забудьте включити "ІГНОРУЙТЕ 1 РЯДКИ" перед тим, як вставляти їх у список полів

Звучить багато роботи, але легко з emacs .....


0

Використовуйте програму TablePlus: Клацніть правою кнопкою миші на назві таблиці на правій панелі. Виберіть Імпорт ...> З CSV Виберіть файл CSV Перегляньте відповідність стовпців та натисніть Імпортувати все готово!


-3

Я маю google search багато способів імпорту CSV до mysql, включаю "завантаження даних у файл", використання робочого середовища mysql тощо.

коли я використовую кнопку імпорту робочого середовища mysql, спочатку вам потрібно створити порожню таблицю самостійно, встановити кожен тип стовпця самостійно. Примітка: вам слід додати стовпець ідентифікатора в кінці як первинний ключ, а не null і auto_increment, інакше пізніше кнопка імпорту не буде видно. Однак, коли я починаю завантажувати файл CSV, нічого не завантажується, здається помилкою. Я здаюся.

На щастя, найкращий найпростіший спосіб, який я знайшов, - це використовувати mysql Oracle для Excel. ви можете завантажити його звідси mysql для excel

Це те, що ви збираєтеся зробити: відкрити файл CSV у Excel, на вкладці Дані, знайти кнопку MySQL для Excel

виділіть усі дані, натисніть кнопку експортувати в mysql. Примітка: встановити стовпець ідентифікатора як первинний ключ.

по закінченні перейдіть до робочого середовища mysql, щоб змінити таблицю, наприклад тип валюти повинен бути десятковим (19,4) для великої десяткової суми (10,2) для звичайного використання. інший тип поля може бути встановлений як varchar (255).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.