【发布时间】:2014-01-26 19:24:05
【问题描述】:
抱歉标题,不知道更好的描述方式。我现在有点卡住了,需要一些帮助。
我正在尝试使用 DBI 从数据库中检索值。我有一个 CSV 文件,其中包含键和表中的多个对应键及其值。
CSV 看起来像这样,相当简单:
ID;Etc;Etc
10003999;Data;More Data;
10003800;Data;More Data;
10019764;Data;More Data;
10054483;Data;More Data;
10054540;Data;More Data;
10063434;Data;More Data;
10067815;Data;More Data;
10067819;Data;More Data;
10073005;Data;More Data;
数据库中的数据如下所示:
ID Value
10003999 176
10003999 225
10003999 161
10003999 137
10003800 38
10003800 225
10003800 141
10003800 176
10003800 181
10003800 176
10003800 175
10003800 137
10019764 137
10073005 41
如您所见,csv 文件中的一个 ID 可以匹配数据库表中的多个 ID。 我要的是这个:
ID;Etc;Etc;;;
10003999;Data;More Data;176;225;161;137
10003800;Data;More Data;175;176;38;176;141;225;137;181
10019764;Data;More Data;137
10054483;Data;More Data;
10054540;Data;More Data;
10063434;Data;More Data;
10067815;Data;More Data;
10067819;Data;More Data;
10073005;Data;More Data;41
因为我不知道 ID 有多少对应的值,所以我将它们推送到数组中。它可以工作,但它只将一个值推送到数组(找到匹配项的位置),而不是 8(例如 id:10003859)。我该如何继续?我猜第二个循环?因为这超出了我的范围。这是我的剧本,也是我到目前为止所拥有的。它不是最好的代码,因为这是我必须使用的......我无法调整它或使用模块(dbi 除外)。老实说,我不擅长 Perl。
# Opening and connecting stuff here
my $sql_query = "SELECT id,value FROM `data`.`table`";
my $hash = $dbh->selectall_hashref($sql_query,'id');
my $i = 0;
my @infile=<INFILE>;
foreach (@infile) {
my @elements = split(";",$infile[$i]);
chomp(@elements);
if (exists $hash->{$elements[$kolom_key]}) {
my $value = $hash->{$elements[$kolom_key]}->{value};
push (@elements, $value);
undef $value;
};
$elements[-1] = $elements[-1] . "\n";
@elements = join(";",@elements);
print OUTFILE "@elements";
$i = $i+1;
}
$dbh->disconnect;
close(INFILE);
close(OUTFILE);
【问题讨论】:
-
你没有给
$kolom_key赋值 -
没错,它在脚本中不可见.. 我使用 STDIN 为 $kolom_key 分配一个值(它在“打开和连接的东西”下)
-
也许您应该查看文档,看看
selectall_hashref做了什么。然后使用Data::Dumper和print Dumper $hash看看你实际拥有什么样的数据结构。如果可以避免的话,几乎总是首选不要一次获取所有数据,或者一次将整个文件读入数组。在这种情况下就是这样,并且可以使这变得相当简单。 -
csv 文件中的 ID 是否与数据库中的所有 ID 完全匹配? IE。您能否遍历其中任何一个并确保所有 ID 都已计算在内?
-
我读过数据转储器,它看起来像一个有用的模块,所以我想使用它。非常适合告诉我发生了什么。但是现在我很高兴如果我能做到这一点。数据库中的 ID 完全相同。这应该是可能的,但我不知道该怎么做