Tengo una hoja de cálculo que realmente tiene solo una tabla complicada. Básicamente, convierto la hoja de cálculo en cvs y utilizo una secuencia de comandos groovy para generar las secuencias de comandos INSERT.
Sin embargo, no puedo hacer esto con una tabla que tiene 28 campos con datos dentro de algunos de los campos en la hoja de cálculo que hacen que la importación al CVS sea aún más complicada. Entonces, los campos en el nuevo CVS no se diferencian correctamente o mi script no lo ha contabilizado.
¿Alguien tiene alguna sugerencia sobre un mejor enfoque para hacer esto? Gracias.
Eche un vistazo a la statement LOAD DATA INFILE . Le ayudará a importar datos del archivo CSV en la tabla.
Trabajo en un producto llamado SQLizer https://sqlizer.io que convierte archivos de Excel (y CSV) en instrucciones de inserción de MySQL que se pueden ejecutar para insertar los datos, o pegarlos en varios sistemas de administración de bases de datos.
Es gratis para archivos de hasta 5000 filas de datos
Esta es una pregunta recurrente en stackoverflow. Aquí hay una respuesta actualizada.
En realidad, hay varias maneras de importar un archivo de Excel a una base de datos MySQL con diversos grados de complejidad y éxito.
Utilidades Excel2MySQL o Navicat . Divulgación completa, soy el autor de Excel2MySQL. Estas 2 utilidades no son gratuitas, pero son la opción más fácil y tienen menos limitaciones. También incluyen características adicionales para ayudar a importar datos de Excel en MySQL. Por ejemplo, Excel2MySQL crea automáticamente su tabla y automáticamente optimiza los tipos de datos de campo como fechas, horas, carrozas, etc. Si tiene prisa o no puede obtener otras opciones para trabajar con sus datos, estas herramientas pueden satisfacer sus necesidades.
LOAD DATA INFILE : esta opción popular es quizás la más técnica y requiere cierta comprensión de la ejecución de comandos MySQL. Debe crear manualmente su tabla antes de cargarla y usar los tipos de campo VARCHAR de tamaño apropiado. Por lo tanto, sus tipos de datos de campo no están optimizados. LOAD DATA INFILE tiene problemas para importar archivos de gran tamaño que superan el tamaño de ‘max_allowed_packet’. Se requiere atención especial para evitar problemas al importar caracteres especiales y caracteres Unicode foráneos. Aquí hay un ejemplo reciente que utilicé para importar un archivo csv llamado test.csv.
phpMyAdmin : Seleccione primero su base de datos, luego seleccione la pestaña Importar. phpMyAdmin creará automáticamente su tabla y dimensionará sus campos VARCHAR, pero no optimizará los tipos de campo. phpMyAdmin tiene problemas para importar archivos de gran tamaño que exceden el tamaño de ‘max_allowed_packet’.
MySQL para Excel : este es un complemento de Excel gratuito de Oracle. Esta opción es un poco tediosa porque utiliza un asistente y la importación es lenta y con errores con archivos grandes, pero esta puede ser una buena opción para archivos pequeños con datos VARCHAR. Los campos no están optimizados.
Hace un tiempo, respondí una pregunta muy similar en el sitio de EE , y ofrecí el siguiente bloque de Perl, como un ejemplo rápido y sucio de cómo se puede cargar directamente una hoja de Excel en MySQL. Pasando por alto la necesidad de exportar / importar a través de CSV y así poder preservar más de esos caracteres especiales, y eliminando la necesidad de preocuparse por escapar del contenido.
#!/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 $0 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();
Nota:
El código anterior depende de una cantidad de módulos de CPAN, que puede instalar, suponiendo que se permita el acceso a ftp saliente, a través de:
cpan YAML Data :: Dumper Spreadsheet :: ParseExcel Tie :: IxHash Encode Scalar :: Util File :: Basename DBD :: mysql
Debería devolver algo en las siguientes líneas (es bastante lento, debido a la confirmación automática):
# ./Excel2mysql.pl test.xls FILE: test.xls DB: test Collection Count: 1 Table(WorkSheet name):Sheet1 Rows inserted(Rows):9892
Para archivos de valores separados por comas (CSV), el panel de vista de resultados en Workbench tiene una opción “Importar registros desde un archivo externo” que importa datos CSV directamente en el conjunto de resultados. Ejecute eso y haga clic en “Aplicar” para confirmar los cambios.
Para archivos de Excel, considere usar el complemento oficial de MySQL for Excel .