从Excel Spreadsheet或CVS导入数据到MySQL
我有一个电子表格,它只有一个复杂的表格。 我基本上将电子表格转换为一个CVS,并使用groovy脚本来生成INSERT脚本。
然而,我不能用一个有28个字段的表格来做到这一点,在电子表格中的某些字段中的数据会导致CVS导入CVS变得更加复杂。 所以新CVS中的字段没有正确区分,或者我的脚本没有考虑到它。
有没有人有更好的方法来做到这一点的任何build议? 谢谢。
看看LOAD DATA INFILE语句。 它将帮助您将CSV文件中的数据导入到表格中。
我使用名为SQLizer的产品https://sqlizer.io ,将Excel(和CSV)文件转换为可插入数据的MySQL插入语句,或者粘贴到各种数据库pipe理系统中。
这是免费的文件多达5000行的数据
这是一个关于计算器的经常性问题。 这是一个更新的答案。
实际上有几种方法可以将不同程度的复杂性和成功导入到MySQL数据库中。
-
Excel2MySQL或Navicat实用程序。 充分的披露,我是Excel2MySQL的作者。 这两个工具不是免费的,但它们是最简单的select,并且具有最less的限制。 它们还包含其他function来帮助将Excel数据导入MySQL。 例如,Excel2MySQL会自动创build表并自动优化字段数据types,如date,时间,浮点数等。如果您急于或无法使用其他选项来处理数据,那么这些实用程序可能会满足您的需求。
-
LOAD DATA INFILE :这个stream行的选项可能是最具技术性的,需要对MySQL命令的执行有所了解。 您必须在加载之前手动创build表,并使用适当大小的VARCHAR字段types。 因此,您的字段数据types未被优化。 LOAD DATA INFILE无法导入超过“max_allowed_packet”大小的大文件。 需要特别注意避免导入特殊字符和外来unicode字符的问题。 以下是我用来导入名为test.csv的csv文件的最近示例。
-
phpMyAdmin :首先select您的数据库,然后select导入选项卡。 phpMyAdmin会自动创build你的表并且设置你的VARCHAR字段的大小,但是它不会优化字段types。 phpMyAdmin无法导入超过“max_allowed_packet”大小的大文件。
-
MySQL for Excel :这是一个免费的Excel加载项。 这个选项有点乏味,因为它使用了一个向导,导入速度很慢,而且大文件也有问题,但是对于VARCHAR数据的小文件来说这可能是一个不错的select。 字段没有优化。
前段时间,我在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();
注意:
- 更改连接($ oConn)string以适应,并在需要时添加用户标识和密码到参数。
- 如果您需要XLSX支持,则只需快速切换到Spreadsheet :: XLSX即可。 另外,它只需要几行代码来检测文件types并调用相应的库。
- 以上是一个简单的黑客行为,假设单元格中的所有内容都是string/标量,如果保留types很重要,可以使用一些带有less量正则expression式的函数与less数if语句结合使用,以确保数字/date保留在适用的格式写入数据库时
-
上面的代码是依赖于一些CPAN模块,你可以安装,假设允许出站ftp访问,通过:
cpan YAML Data :: Dumper Spreadsheet :: ParseExcel Tie :: IxHash Encode Scalar :: Util File :: Basename DBD :: mysql
应该沿着以下的方向返回一些东西(这很慢,由于自动提交):
# ./Excel2mysql.pl test.xls FILE: test.xls DB: test Collection Count: 1 Table(WorkSheet name):Sheet1 Rows inserted(Rows):9892
对于逗号分隔值(CSV)文件,Workbench中的结果视图面板具有“从外部文件导入logging”选项,可将CSV数据直接导入结果集。 执行它,然后单击“应用”提交更改。
对于Excel文件,请考虑使用官方MySQL for Excel插件 。