【发布时间】:2016-02-26 09:46:08
【问题描述】:
我尝试导入一个 CSV 文件,但没有成功。文件中的整数不会被导入,它们都会变成零。
这是 csv 文件。
RankOrderBy,EmployeeID,RankSurnameInitial,MustersAttended,BrigadeMusters,Brigade12MonthIncidents,Incidents Attended,Muster Pct,Incident Pct,OIC,Driver,Crew,OwnTransport,Total At Incident,At Station,Total Other,Incidents On Leave,Incidents Absent,Total Incident Tasks
5,900872,"SFF xxxxx, R J",32,48,241,74,0.6666667,0.30705394,0,24,27,0,51,23,23,62,105,241
19,904308,"OS-FF xxxxx, P H",38,48,241,123,0.7916667,0.51037344,9,12,30,1,52,71,71,0,118,241
4,904565,"SO xxxxxx, G R",48,48,241,190,1,0.78838174,31,7,33,0,71,119,119,0,51,241
3,905042,"SSO xxxxx, G W",40,48,241,130,0.8333333,0.53941909,49,5,12,2,68,62,62,2,109,241
5,905045,"SFF xxxxx, J G",41,48,241,175,0.8541667,0.72614108,2,100,34,0,136,39,39,13,53,241
5,905053,"SFF xxxxx, E J",43,48,241,118,0.8958333,0.48962656,9,1,54,0,64,54,54,0,123,241
5,905074,"SFF xxxxxx, D M",25,48,241,116,0.5208333,0.4813278,4,9,28,1,42,74,74,0,125,241
4,905088,"SO Sarcich, G",41,48,241,122,0.8541667,0.50622407,26,28,16,2,72,50,50,22,97,241
7,905089,"FF xxxxx, B A",33,48,241,42,0.6875,0.17427386,1,0,16,2,19,23,23,0,199,241
4,905096,"SO xxxxxx, S J",40,48,241,144,0.8333333,0.59751037,36,10,31,8,85,59,59,0,97,241
19,905132,"OS-FF xxxxx, V L",25,48,241,14,0.5208333,0.05809129,1,1,4,0,6,8,8,57,170,241
15,905188,"OS-SSO xxxxx, I J",32,48,241,74,0.6666667,0.30705394,15,4,3,0,22,52,52,0,167,241
19,907999,"OS-FF xxxxx, G J",26,48,241,71,0.5416667,0.29460581,3,20,8,0,31,40,40,1,169,241
6,909727,"QFF xxxxx, S M",31,48,241,71,0.6458333,0.29460581,0,0,58,0,58,13,13,0,170,241
20,909799,"OS-RFF xxxxxx, D ",32,42,209,91,0.7619048,0.4354067,4,3,17,1,25,66,66,26,92,241
7,909991,"FF xxxxx, B T",25,48,241,53,0.5208333,0.21991701,0,0,15,2,17,36,36,0,188,241
5,910323,"SFF xxxx, S F",47,48,241,117,0.9791667,0.48547718,1,31,54,0,86,31,31,0,124,241
6,911345,"QFF xxxxx, D",39,48,241,129,0.8125,0.53526971,6,2,45,4,57,72,72,16,96,241
5,912197,"SFF xxxxx, M D",46,48,241,212,0.9583333,0.87966805,12,56,69,2,139,73,73,0,29,241
1,930928,"CFO xxxxx, J E",44,48,241,150,0.9166667,0.62240664,24,1,5,3,33,117,117,0,91,241
2,933456,"DCFO xxxxxx, A C",43,48,241,196,0.8958333,0.81327801,137,8,3,2,150,46,46,3,42,241
6,934986,"QFF xxxxxxx, T P",26,48,241,47,0.5416667,0.19502075,0,8,6,1,15,32,32,0,194,241
6,936929,"QFF xxxxxx, S T",30,48,241,63,0.625,0.26141079,0,2,33,1,36,27,27,14,164,241
6,937215,"QFF xxxxx, K S",37,48,241,44,0.7708333,0.18257261,0,7,22,0,29,15,15,9,188,241
6,938180,"QFF xxxxx, S J",40,48,241,125,0.8333333,0.5186722,2,23,24,0,49,76,76,0,116,241
7,942978,"FF xxxxx, K",43,48,241,111,0.8958333,0.46058091,0,0,94,0,94,17,17,0,130,241
20,943016,"OS-RFF xxxxx, S M",41,48,241,115,0.8541667,0.47717842,8,24,17,4,53,62,62,1,125,241
7,992884,"FF xxxxx, A M",28,48,78,38,0.5833333,0.48717949,0,0,22,0,22,16,16,0,203,241
7,993131,"FF xxxxx, R W",43,44,78,134,0.9772728,1.71794872,1,0,67,0,68,66,66,0,80,241
7,993279,"FF xxxxx, J R",31,39,42,78,0.7948718,1.85714286,0,0,36,0,36,42,42,1,117,241
7,993289,"FF xxxxx, C P",25,37,42,17,0.6756757,0.4047619,0,0,11,0,11,6,6,0,169,241
7,993327,"FF xxxxx, N",31,34,42,93,0.9117647,2.21428571,1,0,70,1,72,21,21,0,82,241
99,993941,"xxxxx, B A",7,8,38,0,0.875,0,0,0,0,0,0,0,0,0,38,241
这是我的脚本。
#!/usr/bin/perl -w
use strict;
use warnings;
use File::Basename;
use DBI;
use DBD::mysql;
my $query="";
my $filename = "./muster.csv";
open(ACCESS_INFO, "<./access.DB") || die "Can't access login credentials";
my $database = <ACCESS_INFO>;
my $host = <ACCESS_INFO>;
my $userid = <ACCESS_INFO>;
my $passwd = <ACCESS_INFO>;
chomp ($database, $host, $userid, $passwd);
close(ACCESS_INFO);
my $connectioninfo="DBI:mysql:$database:$host";
my $dbh = DBI->connect($connectioninfo, $userid, $passwd, {mysql_enable_utf16 => 1} );
my $sth = $dbh->prepare("DROP TABLE `tbl.test`");
$sth->execute;
my $sql = "CREATE TABLE IF NOT EXISTS `tbl.test` (`RankOrderBy` int(11) DEFAULT NULL, `EmployeeID` int(11) DEFAULT NULL, `RankSurnameInitial` text, "
. "`MustersAttended` int(11) DEFAULT NULL, `BrigadeMusters` int(11) DEFAULT NULL, `Brigade12MonthIncidents` int(11) DEFAULT NULL, `IncidentsAttended` int(11) DEFAULT NULL, "
. " `MusterPct` double DEFAULT NULL, `IncidentPct` double DEFAULT NULL, `OIC` int(11) DEFAULT NULL, `Driver` int(11) DEFAULT NULL, `Crew` int(11) DEFAULT NULL, "
. "`OwnTransport` int(11) DEFAULT NULL, `TotalAtIncident` int(11) DEFAULT NULL, `AtStation` int(11) DEFAULT NULL, `TotalOther` int(11) DEFAULT NULL, "
. "`IncidentsOnLeave` int(11) DEFAULT NULL, `IncidentsAbsent` int(11) DEFAULT NULL, `TotalIncidentTasks` int(11) DEFAULT NULL)";
my $sth1 = $dbh->prepare($sql);
$sth1->execute;
$query = q{LOAD DATA INFILE '/home/pi/Documents/NZFS/book1.csv'
INTO TABLE `tbl.test`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES (
RankOrderBy,
EmployeeID,
RankSurnameInitial,
MustersAttended,
BrigadeMusters,
Brigade12MonthIncidents,
IncidentsAttended,
MusterPct,
IncidentPct,
OIC,
Driver,
Crew,
OwnTransport,
TotalAtIncident,
AtStation,
TotalOther,
IncidentsOnLeave,
IncidentsAbsent,
TotalIncidentTasks
)
};
my $sqlQuery = $dbh->prepare($query);
#$sqlQuery->trace(2);
my $rv = $sqlQuery->execute();
$dbh->disconnect();
exit;
这是在 MYSQL Workbench 中查看的结果
所以发生了一些事情。 1. csv 文件中的数字没有被输入到表格中,它们以零结尾 2. LOAD DATA INFILE 语句没有考虑到 ENCLOSED BY '"' 来说明其中也有一个角的字段名称。 3. 您会在 CSV 文件中看到字母之间没有空格,即; SFF,由于某种原因,这在表格中显示为 S F F,可能是上述问题的一部分。
任何指针都会很棒。
谢谢
【问题讨论】:
-
当字段被
"包围时,导入期望所有字段都被这个"包围。 -
为什么要使用 Perl 呢?看来您正在为问题添加不必要的额外层。
-
文件book1.csv的编码是什么?如果这是在 unixlike 系统上,
file book1.csv的输出是什么? -
多余的空格可能表明您正在尝试加载 mysql 声明
LOAD DATA INFILE无法处理的 ucs2 或 utf16 文件。您可能希望确保使用 ascii 或 utf8 对 csv 文件进行编码。 -
感谢那些提供帮助的人。问题在于编码,文件是 utf16,一旦转换为 utf8,它就可以正常工作。