【问题标题】:Perl mysql - importing csv filePerl mysql - 导入 csv 文件
【发布时间】: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 中查看的结果

Results from 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,它就可以正常工作。

标签: mysql perl csv


【解决方案1】:

整数是整数及其负数。因此,这些数字永远不能是整数:

  • 分数
  • 小数
  • 百分比

尝试将列类型更改为 FLOAT 或 DECIMAL 而不是 INT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2013-07-24
    • 2017-03-03
    • 2016-06-05
    • 1970-01-01
    相关资源
    最近更新 更多