2010-09-03 6 views
198

У меня есть ненормализованный дневник событий CSV от клиента, который я пытаюсь загрузить в таблицу MySQL, чтобы я мог реорганизовать в нормальный формат. Я создал таблицу под названием «CSVImport», которая имеет одно поле для каждого столбца файла CSV. CSV содержит 99 столбцов, так что это было достаточно сложной задачей само по себе:Как импортировать CSV-файл в таблицу MySQL

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

Нет ограничений нет на столе, и все поля содержат (256) значения VARCHAR, за исключением столбцов, содержащих отсчеты (в лице INT), да/нет (представлено BIT), цены (представлены DECIMAL) и текстовые объявления (представлены TEXT).

Я пытался загрузить данные в файл:

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

Вся таблица заполнена NULL.

Я думаю, что проблема заключается в том, что текстовые объявления содержат более одной строки, а MySQL анализирует файл так, как если бы каждая новая строка соответствовала одной строке базы данных. Я могу загрузить файл в OpenOffice без проблем.

Файл clientdata.csv содержит 2593 строки и 570 записей. Первая строка содержит имена столбцов. Я думаю, что он разделен запятыми, и текст, по-видимому, ограничен с помощью doublequote.

UPDATE:

Если вы сомневаетесь, прочитайте инструкцию: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

я добавил информацию LOAD DATA заявление, что OpenOffice был достаточно умен, чтобы сделать вывод, и теперь он загружает правильное количество записей:

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; 

Но все еще есть много полностью NULL записей, и ни одна из данных, которые загружены, кажется, находится в нужном месте.

+9

И если вы находитесь на OSX [Sequel Pro] (http://www.sequelpro.com/), есть удивительный инструмент для импорта, и это ** БЕСПЛАТНО ** ;-) – Merrick

+18

Удивительно, что оригинальный плакат ответил на свой вопрос лучше, чем кто-либо еще ... Я не знаю, почему так много людей готовы дать рекомендации по программному обеспечению, когда есть существующая команда SQL, которая может быть * программной *, а не на основе UI. Я не знаю ни о ком другом, но программным средством для меня является то, что у меня могут быть сценарии, настроенные на автоматическое импортирование файлов на отметках времени, тогда как UI-based - чисто ручной. –

+0

@ChrisCirefice: Я думаю, что принятый ответ объясняет это хорошо. Ему понадобилась помощь вручную, создавая команду «load data», с которой может помочь графическая программа. После того, как графическая программа создала команду «load data», он мог бы затем повторно использовать ее программно. – AlexC

ответ

101

Ядро вашей проблемы похоже на сопоставление столбцов в CSV-файле с таковыми в таблице.

Многие графические клиенты mySQL имеют очень приятные диалоги импорта для такого рода вещей.

Мой любимый работник - HeidiSQL. Он дает вам графический интерфейс для сборки команды LOAD DATA; вы можете повторно использовать его программно позже.

Import textfile

Screenshot: "Import textfile" dialog

Чтобы открыть Импортировать текстовый файл»диалогового окна, перейдите к Tools > Import CSV file:. Командной строки

enter image description here

+14

Для Mac OSX используйте Sequel Pro. –

+2

Я просто попробовал, и мне нужно сначала создать таблицу ... вместо использования имен столбцов. – Dominique

+0

@ Dominique, которого не должно быть. Какое сообщение вы получаете точно? Вы видите столбцы из первой строки в CSV в диалоговом окне импорта? –

7

для MySQL подвержен слишком много проблем по импорту Вот как вы это делаете:

  • use excel для редактирования имен заголовков без пробелов
  • сохранить как.CSV
  • использование бесплатно Navicat Lite Sql Browser для импорта и автоматического создания новой таблицы (дать ему имя)
  • открыть новую таблицу вставить столбец первичного авто номер для ID
  • изменить тип столбцов по желанию ,
  • сделано!
132

Используйте mysqlimport, чтобы загрузить таблицу в базу данных:

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/

Чтобы сделать разделитель вкладки, используйте --fields-terminated-by='\t'

+2

'mysqlimport' использует' LOAD DATA INFILE ... 'за кулисами, так что это почти то же самое. –

+3

Как и в случае с 'LOAD DATA INFILE', вам нужно создать таблицу, прежде чем вы сможете использовать' mysqlimport'. –

+0

@ MladenJablanović, это определенно не то же самое. Попробуйте импортировать строки в 1 бил. Вы будете удивлены, какая огромная разница в производительности: – ninjabber

2

Вы также можете попробовать это онлайн-инструмент для создания SQL create/insert операторов на основе CSV. http://www.convertcsvtomysql.com/

Что мне нравится об этом инструменте:

  • Простой
  • Это не только генерирует операторы INSERT, но и создавать операторы , чтобы сгенерировать таблицу
  • При создании CREATE заявления, этот инструмент не просто делает все поля VARCHAR - он анализирует данные в вашем CSV и на основе этого анализа выбирает правильный тип данных.

Недостатки

  • Входной размер файла ограничен 3mb
  • Вы можете быть не готовы отдать свои данные в какой-либо третьей стороной
+2

[SQL Fiddle] (http://sqlfiddle.com/) тоже делает это. двигатель базы данных в MySQL, нажмите «Текст в DDL», вставьте содержимое CSV в диалоговое окно и нажмите «Добавить в DDL». Панель DDL будет содержать оператор CREATE TABLE и инструкцию INSERT VALUES. Если вы не нажмете «build schema», , все данные остаются в вашем веб-браузере.Я не тестировал его на больших файлах CSV. –

+0

очень хороший сайт, так как он генерирует многозначную начальную начальную запись INSERT, которая полностью настраивается и надежна для вставки данных по сравнению с импортом CSV. –

+0

Этот инструмент похоже, имеет много проблем с экранированными запятыми и автоматическое угадывание разделителя.Еще действительно нужно, чтобы сказать, что такое разделитель CSV, и уважать экранированные символы разделителя. –

16

PHPMYADMIN может обрабатывать CSV Импортировать. Ниже приведены этапы:

  1. Подготовить файл CSV, чтобы иметь поля в том же порядке, что и поля таблицы MySQL.

  2. Удалите строку заголовка из CSV (если есть), чтобы в файл были только данные.

  3. Перейти к интерфейсу phpMyAdmin.

  4. Выберите таблицу в меню слева.

  5. Нажмите кнопку импорта вверху.

  6. Просмотрите CSV-файл.

  7. Выберите опцию "CSV using LOAD DATA".

  8. Введите «,» в «поля, завершенные».

  9. Введите имена столбцов в том же порядке, что и в таблице базы данных.

  10. Нажмите кнопку «Пуск», и все готово.

Это примечание, которое я подготовил для своего будущего использования и поделился здесь, если кому-то может пригодиться.

+0

Это хорошо и просто. Я предпочитаю создавать таблицы и столбцы через SQL (поэтому я пропускаю Шаг № 9) и вставляя данные через импорт CSV. Не забудьте установить «NULL» в CSV для любых полей/столбцов с автоматическим увеличением. – silver

+0

Обратите внимание, что phpMyAdmin терпит неудачу, когда кириллические символы включены в CSV-файл, независимо от того, вы скажете ему использовать utf-8. –

+0

Не забудьте изменить размер импорта, если вы импортируете большой файл CSV. Кстати, это не очень хороший вариант для больших файлов CSV. – Avi

59

Простейшее путь, который я импортировал более 200 строк ниже команд в окне SQL PHPMYADMIN

У меня есть простая таблица страны с двумя столбцами CountryId, COUNTRYNAME

здесь является .csv данные CSV FILE

здесь команда:

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

Храните одну вещь в виду, никогда не появляются, во втором столбце, в противном случае ваш импорт остановится.

+1

',' -> '\ t', '"' -> '' в случае файлов TSV и удалите последнюю строку, если нет заголовка. (Сканирование поисковых сканеров индексирует это). –

+10

Если это локальный файл, вам может понадобиться для «LOAD DATA LOCAL INFILE» .Если это выдает ошибку 1148 «Использованная команда не разрешена», вы можете включить ее, запустив mysql в командной строке с помощью '--local-infile'. –

+0

У меня ошибка: ERROR 1045 (28000): Доступ запрещен для пользователя '@'% '(с использованием пароля: ДА) –

1

Если вы используете Windows-машину с загруженной электронной таблицей Excel, новый плагин mySql для Excel является феноменальным. Люди в Oracle действительно хорошо справились с этим программным обеспечением. Вы можете напрямую подключиться к базе данных из Excel. Этот плагин будет анализировать ваши данные и настраивать таблицы для вас в формате, совместимом с данными. У меня были некоторые файлы csv больших монстров данных для преобразования. Этот инструмент был большой экономии времени.

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

Вы можете сделать обновление из в Excel, которые населяют в базу данных в Интернете. Это очень хорошо работало с файлами mySql, созданными на ультра недорогом хостинге GoDaddy. (Обратите внимание, что при создании таблицы в GoDaddy вам нужно выбрать некоторые нестандартные настройки, чтобы отключить доступ к базе данных в базе данных ...)

С помощью этого плагина у вас есть чистая интерактивность между вашей электронной таблицей XL и онлайн-данными mySql место хранения.

10

Вы можете исправить это, указав столбцы в инструкции LOAD DATA. Из manual:

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

... так что в вашем случае вам необходимо перечислить 99 столбцов в том порядке, в котором они появляются в файле CSV.

0

PHP запрос для импорта CSV-файла в базу данных MySQL

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

** Образец данных CSV файл **

name,mobile,email 
Christopher Gritton,570-686-3439,[email protected] 
Brandon Wilson,541-309-5149,[email protected] 
Craig White,516-795-8065,[email protected] 
David Whitney,713-214-3966,[email protected] 
21

I know that the question is old, But I would like to share this

Я использовал этот метод, чтобы импортировать более 100K записей (~ 5MB) в 0.046sec

Вот как вы это делаете,

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

Это очень важно включить в последнюю строку, если у вас есть более одного поля обычно т.е. он пропускает последнее поле (MySQL 5.6.17)

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

Тогда, предполагая, что у вас есть первой строки в качестве заголовка для ваших полей, вы можете включить эту линию также

IGNORE 1 ROWS; 

Приветствие

+0

Я импортировал 16k строк и 48 столбцов. Спасибо, приятель. –

-1

Вот образец первенствует file screen shot:

enter image description here

Сохранить как и выбрать .csv.

И вы получите, как показано ниже. CSV-экран данных, если вы открываете с помощью блокнота ++ или любого другого блокнота.

enter image description here

Убедитесь, что вы удалить заголовок и иметь выравнивание столбцов в формате CSV, как в таблице тузд. Заменить название_папки по имени папки

LOAD DATA LOCAL INFILE
'D: /folder_name/myfilename.csv' INTO TABLE почты ПОЛЕЙ TERMINATED BY '' (имя_файла, LNAME, электронная почта, телефон);

Если большие данные, вы можете взять кофе и загрузить его !.

Это все, что вам нужно.

+0

Вы можете прочитать руководство. [Import CSV codeigniter] (http: // www.twotutorial.com/2016/03/how-to-import-csv- file-in-mysql-using.html), надеюсь, это поможет вам. – NomanJaved

1

Change servername,username, password,dbname,path of your file, tablename and the field which is in your database you want to insert

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

Попробуйте это, он работал для меня

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

ИГНОРИРУЙТЕ 1 ROWS здесь игнорирует первую строку, которая содержит имена полей. Обратите внимание, что для имени файла вы должны ввести абсолютный путь к файлу.

Смежные вопросы