Импорт данных из электронной таблицы Excel или CVS в MySQL

У меня есть таблицы, которая действительно имеет только одну сложную таблицу. Я в основном конвертирую электронную таблицу в cvs и использую groovy-скрипт для создания сценариев вставки.

однако я не могу сделать это с таблицей, которая имеет 28 полей с данными в некоторых полях электронной таблицы, что делает импорт в CVS еще более сложным. Таким образом, поля в новых CVS не дифференцированы должным образом или мой скрипт не учитывал это.

есть ли у кого-нибудь какие-либо предложения относительно лучшего подхода к этому? Спасибо.

5 ответов


посмотреть ЗАГРУЗИТЬ ДАННЫЕ INFILE заявление. Это поможет вам импортировать данные из файла CSV в таблицу.


Я работаю над продуктом под названием SQLizer https://sqlizer.io который преобразует файлы Excel (и CSV) в инструкции MySQL insert, которые могут быть запущены для вставки данных или вставлены в различные системы управления БД.

SQLizer

Это бесплатно для файлов до 5000 строк данных


это повторяющийся вопрос о stackoverflow. Вот обновленный ответ.

на самом деле существует несколько способов импорта файла excel в базу данных MySQL с различной степенью сложности и успеха.

  1. Excel2MySQL или программа утилиты. Полное раскрытие, я автор Excel2MySQL. Эти 2 утилиты не бесплатны, но они являются самым простым вариантом и имеют наименьшее количество ограничения. Они также включают дополнительные функции, чтобы помочь с импортом данных Excel в MySQL. Например, Excel2MySQL автоматически создает таблицу и автоматически оптимизирует типы данных полей, такие как даты, время, поплавки и т. д. Если вы торопитесь или не можете получить другие опции для работы с вашими данными, эти утилиты могут удовлетворить ваши потребности.

    screenshot of Excel2MySQL

  2. ЗАГРУЗИТЬ ДАННЫЕ INFILE: этот популярный вариант, возможно самый технический и требует некоторого понимания выполнения команды MySQL. Перед загрузкой необходимо вручную создать таблицу и использовать типы полей VARCHAR соответствующего размера. Поэтому типы данных полей не оптимизированы. Загрузка данных INFILE имеет проблемы с импортом больших файлов, которые превышают размер "max_allowed_packet". Особое внимание необходимо, чтобы избежать проблем с импортом специальных символов и иностранных символов Юникода. Вот недавний пример, который я использовал для импорта файла csv с именем тест.csv.

    enter image description here

  3. phpMyAdmin и: сначала выберите базу данных, затем перейдите на вкладку импорт. phpMyAdmin автоматически создаст вашу таблицу и размер ваших полей VARCHAR, но не оптимизирует типы полей. phpMyAdmin имеет проблемы с импортом больших файлов, которые превышают размер "max_allowed_packet".

    enter image description here

  4. MySQL для Excel: это бесплатная надстройка Excel от Oracle. Этот параметр немного утомителен, потому что он использует мастер, а импорт медленный и багги с большими файлами, но это может быть хорошим вариантом для небольших файлов с данными VARCHAR. Поля не оптимизированы.

    enter image description here


для файлов значений, разделенных запятыми (CSV), панель просмотра результатов в Workbench имеет опцию "импорт записей из внешнего файла", которая импортирует данные CSV непосредственно в результирующий набор. Выполните это и нажмите "Применить", чтобы зафиксировать изменения.

для файлов Excel рассмотрите возможность использования официального MySQL для Excel плагин.


некоторое время назад я отвечал на очень похожий вопрос на ээ site, и предложил следующий блок Perl, как быстрый и грязный пример того, как вы могли бы напрямую загрузить лист Excel в MySQL. Обход необходимости экспорта / импорта через CSV и, надеюсь, сохранение большего количества этих специальных символов и устранение необходимости беспокоиться о побеге контента.

#!/usr/bin/perl -w
# Purpose: Insert each Worksheet, in an Excel Workbook, into an existing MySQL DB, of the same name as the Excel(.xls).
#          The worksheet names are mapped to the table names, and the column names to column names.
#          Assumes each sheet is named and that the first ROW on each sheet contains the column(field) names.
#

use strict;
use Spreadsheet::ParseExcel;
use DBI;
use Tie::IxHash;

die "You must provide a filename to  to be parsed as an Excel file" unless @ARGV;

my $sDbName              = $ARGV[0];
   $sDbName              =~ s/\.xls//i;
my $oExcel               = new Spreadsheet::ParseExcel;
my $oBook                = $oExcel->Parse($ARGV[0]);
my $dbh                  = DBI->connect("DBI:mysql:database=$sDbName;host=192.168.123.123","root", "xxxxxx", {'RaiseError' => 1,AutoCommit => 1});
my ($sTableName, %hNewDoc, $sFieldName, $iR, $iC, $oWkS, $oWkC, $sSql);

print "FILE: ", $oBook->{File} , "\n";
print "DB: $sDbName\n";
print "Collection Count: ", $oBook->{SheetCount} , "\n";

for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++)
{
 $oWkS                   = $oBook->{Worksheet}[$iSheet];
 $sTableName             = $oWkS->{Name};
 print "Table(WorkSheet name):", $sTableName, "\n";
 for(my $iR   = $oWkS->{MinRow} ; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ;  $iR++)
 {
  tie ( %hNewDoc, "Tie::IxHash");
  for(my $iC = $oWkS->{MinCol} ; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++)
  {
   $sFieldName           = $oWkS->{Cells}[$oWkS->{MinRow}][$iC]->Value;
   $sFieldName           =~ s/[^A-Z0-9]//gi;  #Strip non alpha-numerics from the Column name
   $oWkC                 = $oWkS->{Cells}[$iR][$iC];
   $hNewDoc{$sFieldName} = $dbh->quote($oWkC->Value) if($oWkC && $sFieldName);
  }
  if ($iR == $oWkS->{MinRow}){
        #eval { $dbh->do("DROP TABLE $sTableName") };
        $sSql             = "CREATE TABLE IF NOT EXISTS $sTableName (".(join " VARCHAR(512), ", keys (%hNewDoc))." VARCHAR(255))";
        #print "$sSql \n\n";
        $dbh->do("$sSql");
  } else {
        $sSql = "INSERT INTO $sTableName (".(join ", ",keys (%hNewDoc)).") VALUES (".(join ", ",values (%hNewDoc)).")\n";
        #print "$sSql \n\n";
        eval { $dbh->do("$sSql") };
  }
 }
 print "Rows inserted(Rows):", ($oWkS->{MaxRow} - $oWkS->{MinRow}), "\n";
}
# Disconnect from the database.
$dbh->disconnect();

Примечание:

  1. измените строку соединения ($oConn) в соответствии, и при необходимости добавить user-id и пароль к аргументам.
  2. Если вам нужна поддержка XLSX быстрый переход к электронной таблице:: XLSX-это все это необходимо. В качестве альтернативы требуется всего несколько строк кода, чтобы определите тип файла и вызовите соответствующую библиотеку.
  3. выше-это простой хак, предполагает, что все в ячейке строки / scalar, если сохранение типа важно, небольшая функция с несколько regexp можно использовать в сочетании с несколькими операторами if для гарантировать номера / даты остаются в соответствующем формате при написании в DB
  4. приведенный выше код зависит от ряда модулей CPAN, которые вы можете установить, если исходящий ftp-доступ разрешен, через:

    cpan YAML Data:: Dumper Spreadsheet:: ParseExcel Tie:: IxHash кодировать скаляр:: Util файл:: базовое имя DBD:: mysql

должен возвращать что-то по следующим строкам (это довольно медленно, из-за автоматической фиксации):

# ./Excel2mysql.pl test.xls 
FILE: test.xls
DB: test
Collection Count: 1
Table(WorkSheet name):Sheet1
Rows inserted(Rows):9892