Qualche istante fa ho risposto a una domanda molto simile sul sito EE e ho offerto il seguente blocco di Perl, come esempio rapido e sporco di come caricare direttamente un foglio Excel in MySQL. Bypassare la necessità di esportare/importare tramite CSV e quindi sperare di preservare più di quei caratteri speciali ed eliminare la necessità di preoccuparsi di sfuggire al contenuto.
#!/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:
- Cambiate la connessione ($ oConn) stringa da soddisfare, e, se necessario aggiungere un user-id e password per gli argomenti.
- Se è necessario il supporto XLSX, passare rapidamente a Spreadsheet :: XLSX è tutto necessario. In alternativa ci vogliono solo poche righe di codice, per rilevare il tipo di file e chiamare la libreria appropriata.
- Quanto sopra è un semplice hack, assume tutto in una cellula è una stringa /scalare, se il tipo di conservazione è importante, una piccola funzione con qualche regexp può essere utilizzato in combinazione con alcuni if per assicurano numeri/date rimangono nel formato applicabile quando scritto al DB
il codice di cui sopra dipende da una serie di moduli CPAN, che è possibile installare, assumendo l'accesso ftp in uscita è consentito, tramite una:
CPAN YAML Dati :: Dumper Spreadsheet :: ParseExcel Tie :: IxHash Encode Scalare :: File Util :: Basename DBD :: mysql
deve restituire qualcosa lungo le seguenti linee (TIS piuttosto lento, a causa del commit automatico):
# ./Excel2mysql.pl test.xls
FILE: test.xls
DB: test
Collection Count: 1
Table(WorkSheet name):Sheet1
Rows inserted(Rows):9892
Alcuni codice sarebbe utile – Ole
Questo sembra essere molto simile al [3.621.798] (http://stackoverflow.com/questions/3621798) – arober11
possibile duplicato di [Come importare un file excel in MYSQL DATABASE] (http://stackoverflow.com/questions/1310166/how-to-import-a-excel-file-in-to-mysql-database) –