【问题标题】:How can I merge 2 CSV files in Perl with DBI and DBD::CSV?如何将 Perl 中的 2 个 CSV 文件与 DBI 和 DBD::CSV 合并?
【发布时间】:2012-07-23 20:46:22
【问题描述】:

我在为 perl DBD::CSV 包编写 SQL 语句时需要帮助。我想合并 2 个 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"

合并文件应如下所示:

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);

输出应该是我在“[]”括号中的表格,但我得到的只是一个空的“[]”括号,如下所示:

[]

我猜我写的“$query”语句是错误的。你能帮忙找出这个工作的正确查询吗?

谢谢。

【问题讨论】:

    标签: sql perl dbi


    【解决方案1】:

    我不确定 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
    

    【讨论】:

      【解决方案2】:

      您的 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 语句之前就死掉了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 2011-08-23
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 2014-05-17
        相关资源
        最近更新 更多