2012-07-23 79 views
1

我需要帮助写入perl DBD :: CSV包的SQL语句。我想合并2个CSV文件如下:如何将Perl中的2个CSV文件与DBI和DBD :: CSV合并?

file1.csv:

VM_Name,VM_Cluster,VM_Zone 
VM1," Cluster4","Zone3" 
VM2," Cluster3","Zone4" 
VM3," Cluster2","Zone1" 
VM4," Cluster1","Zone2" 

file2.csv:

VM_Name,vFiler_IP,vFiler_Zone 
VM1," 10.10.10.10","Zone5" 
VM2," 10.10.10.11","Zone8" 
VM3," 10.10.10.12","Zone8" 
VM4," 10.10.10.13","Zone8" 

里边反Mergerd文件应该有如下:

VM_Name,VM_Cluster,VM_Zone,vFiler_IP,vFiler_Zone 
VM1," Cluster4","Zone3"," 10.10.10.10","Zone5" 
VM2," Cluster3","Zone4"," 10.10.10.11","Zone8" 
VM3," Cluster2","Zone1"," 10.10.10.12","Zone8" 
VM4," Cluster1","Zone2"," 10.10.10.13","Zone8" 

这是我的Perl代码:

#!/usr/bin/perl -w 

use strict; 
use Data::Dump qw/dump/; 
use DBI; 

my $dbh = DBI->connect ("dbi:CSV:", 
         "", "", 
         { 
           f_dir  =>  './Desktop', 
           f_schema =>  undef, 
           f_ext  =>  '.csv/r', 
         } 
        ) or die " Cannot create Database Handle: $DBI::errstr()"; 
$dbh->{RaiseError} =1 ; 

my $table1 = "file1"; 
my $table2 = "file2"; 


my $query = "SELECT $table1.VM_Name, $tabel1.VM_Cluster, $table1.VM_Zone, $table2.vFiler_IP, $table2.vFiler_Zone FROM $table1 join $table2 WHERE $table1.VM_Name = $table2.VM_Name"; 
my $result = $dbh->selectall_arrayref ($query); 
print dump ($result); 

输出应该是我在“[]”括号expencting的talbe,但我得到的是一个空的“[]”括号如下:

[] 

我猜测的“$查询“我写的说法是错误的。你能帮忙搞清楚这项工作的正确查询吗?

谢谢。

回答

1

。在你的SQL语句中的错字。改变这一行:

my $query = "SELECT $table1.VM_Name, $tabel1.VM_Cluster, $table1.VM_Zone, $table2.vFiler_IP, $table2.vFiler_Zone FROM $table1 join $table2 WHERE $table1.VM_Name = $table2.VM_Name"; 
             ^--- $table1 

您需要使用:

my $query = "SELECT $table1.VM_Name, $table1.VM_Cluster, $table1.VM_Zone, $table2.vFiler_IP, $table2.vFiler_Zone FROM $table1 join $table2 WHERE $table1.VM_Name = $table2.VM_Name"; 

这样,输出对我来说是:

[ 
    ["VM1", " Cluster4", "Zone3", " 10.10.10.10", "Zone5"], 
    ["VM2", " Cluster3", "Zone4", " 10.10.10.11", "Zone8"], 
    ["VM3", " Cluster2", "Zone1", " 10.10.10.12", "Zone8"], 
    ["VM4", " Cluster1", "Zone2", " 10.10.10.13", "Zone8"], 
] 

更新: 如果我运行你的代码与use strict,因为你发布错字,我得到:

Global symbol "$tabel1" requires explicit package name at test.pl line 3726. 

如果我没有严格的运行它,我收到了一堆错误:

Bad table or column name: '.VM_Zone' has chars not alphanumeric or underscore! at C:/Perl/site/lib/SQL/Statement.pm line 88 
DBD::CSV::db selectall_arrayref failed: Bad table or column name: '.VM_Zone' has chars not alphanumeric or underscore! at C:/Perl/site/lib/SQL/Statement.pm line 88 
[for Statement "SELECT file1.VM_Name, file1.VM_Cluster, .VM_Zone, file2.vFiler_IP, file2.vFiler_Zone FROM file1 join file2 WHERE file1.VM_Name = file2.VM_Name"] at test.pl line 3727. 
DBD::CSV::db selectall_arrayref failed: Bad table or column name: '.VM_Zone' has chars not alphanumeric or underscore! at C:/Perl/site/lib/SQL/Statement.pm line 88 
[for Statement "SELECT file1.VM_Name, file1.VM_Cluster, .VM_Zone, file2.vFiler_IP, file2.vFiler_Zone FROM file1 join file2 WHERE file1.VM_Name = file2.VM_Name"] at test.pl line 3727. 

之间是否有您发布什么,你的实际代码什么不同吗?你重新输入了吗?即使没有strict,也不会编译。它甚至不能输出[],因为它在print声明之前死亡。

2

我不知道DBD :: CSV如何尊重SQL,但通常如果你join,你也应该说on加入什么:

select $table1.VM_Name, 
     $tabel1.VM_Cluster, 
     $table1.VM_Zone, 
     $table2.vFiler_IP, 
     $table2.vFiler_Zone 
    FROM $table1 join $table2 
       ON $table1.VM_Name = $table2.VM_Name