2011-11-06 11 views
7

Ho un foglio di calcolo che in realtà ha solo una tabella complicata. In pratica, converto il foglio di calcolo in un cvs e uso uno script groovy per generare gli script INSERT.Importa dati da foglio di calcolo Excel o CVS in MySQL

Tuttavia, non posso farlo con una tabella che contiene 28 campi con dati all'interno di alcuni campi del foglio di calcolo che rendono ancora più complicata l'importazione nel CVS. Quindi i campi nel nuovo CVS non sono differenziati in modo appropriato o il mio script non ne ha tenuto conto.

Qualcuno ha qualche suggerimento su un approccio migliore per fare questo? Grazie.

+0

Alcuni codice sarebbe utile – Ole

+0

Questo sembra essere molto simile al [3.621.798] (http://stackoverflow.com/questions/3621798) – arober11

+0

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

risposta

5

Dai un'occhiata all'istruzione LOAD DATA INFILE. Ti aiuterà a importare i dati dal file CSV nella tabella.

0

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:

  1. Cambiate la connessione ($ oConn) stringa da soddisfare, e, se necessario aggiungere un user-id e password per gli argomenti.
  2. 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.
  3. 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
  4. 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 
2

Questa è una domanda ricorrente su StackOverflow. Ecco una risposta aggiornata.

Esistono diversi modi per importare un file excel in un database MySQL con vari gradi di complessità e successo.

  1. Excel2MySQL o Navicat utilità. Full disclosure, sono l'autore di Excel2MySQL. Queste 2 utilità non sono gratuite, ma sono l'opzione più semplice e hanno il minor numero di limitazioni. Includono anche funzionalità aggiuntive che aiutano nell'importazione di dati Excel in MySQL.Ad esempio, Excel2MySQL crea automaticamente la tabella e ottimizza automaticamente i tipi di dati sul campo come date, orari, float, ecc. Se hai fretta o non puoi ottenere le altre opzioni per lavorare con i tuoi dati, queste utility potrebbero soddisfare le tue esigenze.

    screenshot of Excel2MySQL

  2. LOAD DATA INFILE: questa opzione popolare è forse la più tecnica e richiede una certa comprensione di esecuzione dei comandi MySQL. È necessario creare manualmente la tabella prima di caricare e utilizzare tipi di campi VARCHAR di dimensioni appropriate. Pertanto, i tipi di dati sul campo non sono ottimizzati. LOAD DATA INFILE ha problemi nell'importazione di file di grandi dimensioni che superano la dimensione 'max_allowed_packet'. È necessario prestare particolare attenzione per evitare problemi nell'importazione di caratteri speciali e caratteri Unicode estranei. Ecco un esempio recente che ho usato per importare un file csv chiamato test.csv.

    enter image description here

  3. phpMyAdmin: selezionare il database prima, quindi selezionare la scheda Importa. phpMyAdmin creerà automaticamente la tabella e ridimensionerà i campi VARCHAR, ma non ottimizzerà i tipi di campo. phpMyAdmin ha problemi nell'importazione di file di grandi dimensioni che superano la dimensione 'max_allowed_packet'.

    enter image description here

  4. MySQL for Excel: Questo è un Excel add-in da Oracle. Questa opzione è un po 'noiosa perché utilizza una procedura guidata e l'importazione è lenta e buggata con file di grandi dimensioni, ma questa potrebbe essere una buona opzione per i file di piccole dimensioni con dati VARCHAR. I campi non sono ottimizzati.

    enter image description here

+0

Può Excel2Mysql gestire direttamente un file csv? Il mio CSV è troppo grande per convertire in Excel. – ccleve

0

Per valori separati da virgole (CSV), i risultati visualizzare pannello Workbench ha un "record Importa da esterno file" che importa i dati CSV direttamente nel set di risultati. Eseguilo e fai clic su "Applica" per confermare le modifiche.

Per i file Excel, prendere in considerazione l'utilizzo dello MySQL for Excel plugin ufficiale.

3

Lavoro su un prodotto chiamato SQLizer https://sqlizer.io che converte file Excel (e CSV) in istruzioni di inserimento MySQL che possono essere eseguite per inserire i dati o incollati in vari sistemi di gestione DB.

SQLizer

È gratuito per file fino a 5.000 righe di dati

+0

Sfortunatamente uno strumento online non è un'opzione a causa dei problemi di privacy della mia azienda. – RandomGuy

+0

@RandomGuy Capito - ecco il nostro post di sicurezza comunque http://blog.sqlizer.io/posts/privacy-at-sqlizer/ abbiamo anche una API ora. –

Problemi correlati