我有一個電子表格,它只有一個複雜的表格。我基本上將電子表格轉換爲cvs並使用groovy腳本來生成INSERT腳本。從Excel電子表格或CVS導入數據到MySQL
但是,我無法做到這一點,在電子表格的某些字段中有28個字段的數據表導致CVS導入CVS變得更加複雜。所以新CVS中的字段沒有正確區分,或者我的腳本沒有考慮到它。
有沒有人有更好的方法來做到這一點的任何建議?謝謝。
我有一個電子表格,它只有一個複雜的表格。我基本上將電子表格轉換爲cvs並使用groovy腳本來生成INSERT腳本。從Excel電子表格或CVS導入數據到MySQL
但是,我無法做到這一點,在電子表格的某些字段中有28個字段的數據表導致CVS導入CVS變得更加複雜。所以新CVS中的字段沒有正確區分,或者我的腳本沒有考慮到它。
有沒有人有更好的方法來做到這一點的任何建議?謝謝。
看看LOAD DATA INFILE聲明。它將幫助您將CSV文件中的數據導入到表格中。
後來我回答了一個關於EE網站的非常類似的問題,並提供了下面的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 $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();
注:
上面的代碼是依賴於許多的CPAN模塊,可以安裝,假定站FTP訪問被允許時,通過:
CPAN YAML Data :: Dumper Spreadsheet :: ParseExcel Tie :: IxHash Encode Scalar :: Util File :: Basename DBD :: mysql
應該返回大意如下的東西(TIS相當緩慢,由於自動提交):
# ./Excel2mysql.pl test.xls
FILE: test.xls
DB: test
Collection Count: 1
Table(WorkSheet name):Sheet1
Rows inserted(Rows):9892
這是一個計算器反覆發作的問題。這是一個更新的答案。
實際上有幾種方法可將不同程度的複雜性和成功導入到MySQL數據庫中的excel文件。
Excel2MySQL或Navicat工具。充分披露,我是Excel2MySQL的作者。這兩個實用程序不是免費的,但它們是最簡單的選項,並且具有最少的限制。它們還包含其他功能來幫助將Excel數據導入MySQL。例如,Excel2MySQL會自動創建表並自動優化字段數據類型,如日期,時間,浮點數等。如果您急於或無法使用其他選項來處理數據,那麼這些實用程序可能會滿足您的需求。
LOAD DATA INFILE:這個流行的選擇也許是最技術和需要MySQL命令執行有一定的瞭解。您必須在加載之前手動創建表並使用適當大小的VARCHAR字段類型。因此,您的字段數據類型未經優化。 LOAD DATA INFILE無法導入超過「max_allowed_packet」大小的大文件。需要特別注意避免導入特殊字符和外來Unicode字符的問題。以下是我用來導入名爲test.csv的csv文件的最近示例。
phpMyAdmin:首先選擇你的數據庫,然後選擇導入選項卡。 phpMyAdmin會自動創建你的表並調整VARCHAR字段的大小,但是它不會優化字段類型。 phpMyAdmin無法導入超過「max_allowed_packet」大小的大文件。
MySQL for Excel:這是一個免費的Excel加載從Oracle。這個選項有點繁瑣,因爲它使用了一個嚮導,並且導入速度很慢,並且有大文件的問題,但對於具有VARCHAR數據的小文件來說,這可能是一個不錯的選擇。字段沒有優化。
Excel2Mysql能否直接處理csv文件?我的csv太大而無法轉換爲Excel。 – ccleve
對於逗號分隔值(CSV)文件,結果查看面板在工作臺具有選項直接進口CSV數據到結果集的「從外部文件導入記錄」。執行該操作並單擊「應用」提交更改。
對於Excel文件,請考慮使用官方MySQL for Excel plugin。
我使用名爲SQLizer https://sqlizer.io的產品,它將Excel(和CSV)文件轉換爲可插入數據的MySQL插入語句,或者粘貼到各種數據庫管理系統中。
它是免費的文件長達5000行數據
不幸的是,由於我公司的隱私問題,不能選擇在線工具。 – RandomGuy
@RandomGuy瞭解 - 這裏是我們的安全帖子http://blog.sqlizer.io/posts/privacy-at-sqlizer/我們現在也有一個API。 –
一些代碼將是有益的 – Ole
這似乎是非常相似,[3621798](http://stackoverflow.com/questions/3621798 ) – arober11
可能的重複[如何導入excel文件到MYSQL數據庫](http://stackoverflow.com/questions/1310166/how-to-import-a-excel-file-in-to-mysql-database) –