Как импортировать CSV-файл в таблицу MySQL
у меня есть ненормализованный CSV-дневник событий от клиента, который я пытаюсь загрузить в таблицу MySQL, чтобы я мог рефакторировать в нормальный формат. Я создал таблицу под названием "CSVImport", которая имеет одно поле для каждого столбца CSV-файла. CSV содержит 99 столбцов, поэтому это была достаточно сложная задача сама по себе:
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);
в таблице нет ограничений, и все поля содержат значения VARCHAR (256), за исключением столбцов, содержащих счетчики (представленные INT), yes/no (представлен бит), цены (представлены десятичной дробью) и текстовые кляксы (представлены текстом).
Я попытался загрузить данные в файл:
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 анализирует файл, как если бы каждая новая строка соответствовала одной строке databazse. Я могу загрузить файл в OpenOffice без проблем.
в пункт clientdata.файл CSV содержит 2593 строки и 570 записей. Первая строка содержит имена столбцов. Я думаю, что он разделен запятыми, а текст, по-видимому, разделен doublequote.
обновление:
когда вы сомневаетесь, прочитайте руководство: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
записи, и ни одна из данных, которые были загружены, не кажется в нужном месте.
15 ответов
ядро вашей проблемы, похоже, соответствует столбцам в CSV-файле тем, что в таблице.
многие графические клиенты mySQL имеют очень хорошие диалоги импорта для такого рода вещей.
мой любимый для работы-Windows based HeidiSQL. Это дает вам графический интерфейс для создания LOAD DATA
command; вы можете повторно использовать его программно позже.
Скриншот: "Импорт textfile " dialog
чтобы открыть диалоговое окно" импорт текстового файла", перейдите в Tools > Import CSV file
:
использовать 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'
самый простой способ, который я импортировал 200 + строк, находится ниже команды в окне phpmyadmin sql
У меня есть простая таблица из страны с двумя столбцами CountryId,CountryName
здесь .данные csv
вот команды:
LOAD DATA INFILE 'c:/country.csv'
INTO TABLE country
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
имейте в виду одну вещь, никогда не появляйтесь во втором столбце, иначе ваш импорт остановится
Я знаю, что вопрос старый, но я хотел бы share этой
я использовал этот метод для импорта более 100K записей ( ~5 Мб) в 0.046 сек
вот как вы это делаете:
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);
очень важно включить последнюю строку, если у вас есть более одного поля i.e обычно он пропускает последнее поле (MySQL 5.6.17)
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);
затем, предполагая, что у вас есть первая строка в качестве заголовка для ваших полей вы можете включить эту строку также
IGNORE 1 ROWS
вот как это выглядит, если ваш файл имеет строку заголовка.
LOAD DATA LOCAL INFILE
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);
phpMyAdmin и может обрабатывать импорт CSV. Вот шаги:
подготовьте CSV-файл, чтобы иметь поля в том же порядке, что и поля таблицы MySQL.
удалите строку заголовка из CSV (если есть), чтобы в файле были только данные.
перейдите к интерфейсу phpMyAdmin.
выберите таблицу в меню слева.
жмем Импорт кнопка вверху.
перейдите к файлу CSV.
выберите опцию "CSV с использованием данных загрузки".
введите","в поле "завершается".
введите имена столбцов в том же порядке, что и в таблице базы данных.
Нажмите кнопку Go, и вы сделали.
это примечание, которое я подготовил для моего будущего использования и обмена здесь, Если кто-то еще может извлечь выгоду.
Это можно исправить, перечислив столбцы в инструкции LOAD DATA. От руководство:
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
...поэтому в вашем случае вам нужно перечислить 99 столбцов в том порядке, в котором они появляются в csv-файле.
командная строка mysql склонна к слишком многим проблемам при импорте. Вот как вы это делаете:
- используйте excel для редактирования имен заголовков, чтобы не иметь пробелов
- сохранить как .csv
- используйте бесплатный браузер Navicat Lite Sql для импорта и автоматического создания новой таблицы (дайте ей имя)
- откройте новую таблицу вставьте основной столбец автоматического номера для ID
- изменить тип столбцов по желанию.
- готово!
попробуйте это, это работает для меня
LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;
игнорировать 1 строки здесь игнорирует первую строку, содержащую имена полей. Обратите внимание, что для имени файла необходимо ввести абсолютный путь к файлу.
вы также можете попробовать этот онлайн-инструмент для создания операторов SQL create/insert на основе вашего CSV. http://www.convertcsvtomysql.com/
Что мне нравится в этом инструменте:
- простой
- он не только генерирует операторы INSERT, но и создает операторы для создания таблицы
- при генерации операторов CREATE этот инструмент не просто делает все поля VARCHAR-он анализирует данные в вашем CSV и на основе этого анализа, он выбирает правильный тип данных.
недостатки
- размер входного файла ограничен 3 МБ
- возможно, вы не захотите отдавать свои данные какой-то третьей стороне
Если вы используете MySQL Workbench (в настоящее время версия 6.3), вы можете сделать это:
- щелкните правой кнопкой мыши на "таблицы";
- Выберите Мастер Импорта Табличных Данных;
- выберите csv-файл и следуйте инструкциям (также можно использовать JSON); Хорошо, что вы можете создать новую таблицу на основе csv-файла, который вы хотите импортировать или загрузить данные в существующую таблицу
Если вы используете машину windows с загруженной электронной таблицей Excel, новый плагин mySql для Excel феноменален. Люди в Oracle действительно хорошо поработали над этим программным обеспечением. Подключение к базе данных можно установить непосредственно из Excel. Этот плагин проанализирует ваши данные и настроит таблицы для вас в формате, совместимом с данными. У меня были большие csv-файлы данных для преобразования. Этот инструмент был большой экономией времени.
http://dev.mysql.com/downloads/windows/excel/
вы можете делать обновления из Excel, которые будут заполняться в базе данных в интернете. Это очень хорошо работало с файлами mySql, созданными на ультра недорогом общем хостинге GoDaddy. (Обратите внимание, если вы создаете таблицу в GoDaddy, вы должны выбрать некоторые стандартные параметры, чтобы отключить доступ к сайту базы данных...)
с помощью этого плагина у вас есть чистая интерактивность между вашим XL электронная таблица и онлайн-хранилище данных mySql.
изменить имя сервера,имя пользователя, пароль,имя базы данных,путь к файлу, имя таблицы и поля в базе данных, которую вы хотите вставить
<?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>'
}
?>
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,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus
вот пример файла excel screen shot:
Сохранить как и выбрать .csv.
и у вас будет, как показано ниже .снимок экрана данных csv, если вы открываете с помощью notepad++ или любого другого Блокнота.
убедитесь, что вы удалили заголовок и выровняли столбец .csv как в таблице mysql. Заменить имя_папки-имя папки
ЛОКАЛЬНАЯ ЗАГРУЗКА ДАННЫХ INFILE
'D:/folder_name/myfilename.КШМ'
В столовую почту
ПОЛЯ ЗАКАНЧИВАЮТСЯ НА ','
(fname,lname ,электронная почта, телефон);
Если большие данные, вы можете взять кофе и его нагрузки!.
Это все, что вам нужно.
еще одно решение-использовать csvsql инструмент от amazing csvkit люкс.
пример использования:
csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename $file
этот инструмент может автоматически выводить типы данных (поведение по умолчанию), создавать таблицу и вставлять данные в созданную таблицу. --overwrite
опция может использоваться для удаления таблицы, если она уже существует. --insert
option-заполнить таблицу из файла.
для установки люкс
pip install csvkit
требования: python-dev
, libmysqlclient-dev
, MySQL-python
apt-get install python-dev libmysqlclient-dev
pip install MySQL-python