Импортировать CSV в таблицу mysql

96

Каков наилучший / самый быстрый способ загрузить файл csv в таблицу mysql? Я бы хотел, чтобы первая строка данных использовалась в качестве имен столбцов.

Нашел это:

Как импортировать файл CSV в таблицу MySQL

Но единственный ответ - использовать графический интерфейс, а не оболочку?

lcm
источник
3
И даже решение с графическим интерфейсом пользователя не берет имена столбцов из csv ... вам нужно создать всю таблицу перед импортом
Доминик
На этот вопрос уже есть ответ stackoverflow.com/questions/3635166/…
Дэвид
ответ, принятый на вопрос, на который вы ссылаетесь, использовал графический интерфейс. Ответ, на который вы ссылаетесь, был
дан

Ответы:

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

РЕДАКТИРОВАТЬ

В вашем случае вам сначала нужно написать интерпретатор для поиска первой строки и присвоения им имен столбцов.


РЕДАКТИРОВАТЬ-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)
hjpotter92
источник
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
Hawkee
источник
2
Классный скрипт. Для тех, у кого есть CSV-файлы в двойных кавычках (читают большинство людей), добавьте `ENCASED IN '\"' `к fields terminated by ','... он даже работает с CSV с частичными двойными кавычками.
Джоэл Меллон
3
Я думаю, вы имеете в виду ENCLOSED BY '\"'... Кроме того, многим людям понадобится LINES TERMINATED BY '\r\n'использовать CSV из Windows. И, наконец, экранирование имен полей с помощью обратных кавычек целесообразно, если есть пробелы:$columns .= "`$column` varchar(250)";
dlo
1
Этот ответ намного лучше принятого. В частности, он позволяет то, о чем просил OP, и я также хочу: «первая строка данных будет использоваться в качестве имен столбцов». (Я бы предпочел сценарий на Python, поэтому мне не нужно устанавливать PHP, но его не составит труда перенести.)
Ларш
2
@YumYumYum Не могли бы вы подробнее рассказать о своей проблеме?
Hawkee,
Могу я купить тебе пива?
Джо
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  
Ракеш
источник
3

Если вы запустите mysql как «mysql -u -p --local-infile», он будет работать нормально

Marciomolusco
источник
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());
Ravenchilde
источник
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-скрипт, опубликованный Hawkee, но у меня не получилось. Вместо того, чтобы отлаживать его, я сделал следующее:

1) скопируйте / вставьте строку заголовка файла CSV в файл txt и отредактируйте с помощью emacs. добавьте запятую и CR между каждым полем, чтобы поместить каждое в отдельную строку.
2) Сохранить этот файл в качестве FieldList.txt
3) Отредактируйте файл включить defns для каждого поля (большинство из них были VARCHAR, но совсем немногие из них ИНТ (х). Добавить создать таблицу имя_таблицы (в начале файла и) к конец файла. Сохраните его как CreateTable.sql
4) запустите клиент mysql с вводом из файла Createtable.sql для создания таблицы
5) запустите клиент mysql, скопируйте / вставьте большую часть команды LOAD DATA INFILE, заменяя мою таблицу имя и имя файла csv. Вставьте файл FieldList.txt. Обязательно включите «ИГНОРИРОВАТЬ 1 СТРОКУ» перед вставкой в ​​список полей.

Похоже, много работы, но с emacs легко ...

Джим Симс
источник
0

Использование приложения TablePlus: щелкните правой кнопкой мыши имя таблицы на правой панели. Выберите «Импорт ...»> «Из CSV». Выберите файл CSV. Проверьте соответствие столбца и нажмите «Импортировать все»!

Милад Хатами
источник
-3

У меня есть поиск в Google, много способов импортировать csv в mysql, включая "загрузить данные в файл", использовать рабочую среду mysql и т. Д.

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

К счастью, лучший простой способ, который я нашел, - это использовать Oracle mysql для excel. вы можете скачать его здесь mysql для Excel

Вот что вы собираетесь сделать: откройте файл csv в excel, на вкладке Data найдите mysql для кнопки excel

выберите все данные, нажмите экспорт в mysql. Обратите внимание на установку столбца ID в качестве первичного ключа.

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

блин
источник