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

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

Найдено следующее:

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

Но единственным ответом было использование GUI, а не оболочки?

Ответ 1

Вместо того, чтобы записывать script для получения информации из файла 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 docs в синтаксисе 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)

Ответ 2

У меня была такая же проблема некоторое время назад и написала командную строку PHP script, чтобы сделать это:

http://www.hawkee.com/snippet/8320/

Он создаст таблицу на основе первой строки и импортирует оставшиеся строки в нее. Вот синтаксис командной строки:

php csv_import.php csv_file.csv table_name

Ответ 3

Сначала создайте таблицу в базе данных с теми же номерами столбцов, которые находятся в файле csv.

Затем используйте следующий запрос

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

Ответ 4

если у вас есть возможность установить phpadmin, есть раздел импорта, в котором вы можете импортировать файлы csv в свою базу данных, есть даже флажок, чтобы установить заголовок в первую строку файла, содержащий имена столбцов таблицы (если это unchecked, первая строка станет частью данных

Ответ 5

Для загрузки данных из текстового файла или файла 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  

Ответ 6

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

Ответ 7

Я написал код для этого, я добавлю несколько фрагментов:

$dir = getcwd(); // Get current working directory where this .PHP скрипт 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());

Ответ 8

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

Особенно сложно, если таблица имеет большое количество столбцов.

Здесь python script, который (почти) выполняет задание:

#!/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, если вы в состоянии.

Ответ 9

Вот как я это сделал в Python, используя csv и Коннектор MySQL:

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;

Ответ 10

Импорт 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

Ответ 11

Как отмечали другие, локальная информация о загруженности данных работает просто отлично. Я попробовал PHP скрипт, который опубликовал Hawkee, но не работал у меня. Вместо того, чтобы отлаживать его, вот что я сделал:

1) скопируйте/вставьте строку заголовка CSV файла в файл txt и отредактируйте с помощью emacs. добавьте запятую и CR между каждым полем, чтобы получить каждый из них на своей собственной линии.
2) Сохраните этот файл как файл FieldList.txt
3) отредактируйте файл, чтобы включить defns для каждого поля (большинство из них были varchar, но немало были int (x). Добавьте таблицу tablelename (в начало файла и) в конец файла. Сохраните ее как CreateTable.sql
4) запустите клиент mysql со входом из файла Createtable.sql, чтобы создать таблицу
5) запустите mysql-клиент, скопируйте/вставьте в большинстве команд LOAD DATA INFILE, подставляя мое имя таблицы и имя файла csv. Вставить в файл FieldList.txt. Обязательно включите "IGNORE 1 LINES" перед тем, как вставить их в список полей

Звучит как много работы, но легко с emacs.....

Ответ 12

У меня есть google-поиск для многих способов импорта csv в mysql, включая "load data infile", использование mysql workbench и т.д.

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

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

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

выберите все данные, щелкните export to mysql. Примечание, чтобы установить столбец идентификатора в качестве первичного ключа.

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