1

perl DBD::CSV パッケージの SQL ステートメントを書くのに助けが必要です。以下のように2つのCSVファイルをマージしたい:

ファイル1.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);

出力は、「[]」ブラケットで期待しているタルベである必要がありますが、以下のように空の「[]」ブラケットしか得られません。

[]

私が書いた「$query」ステートメントが間違っていると推測しています。この仕事の正しいクエリを見つけるのを手伝ってくれませんか。

ありがとう。

4

2 に答える 2

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
于 2012-07-23T10:57:37.777 に答える
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.

そして、strict なしで実行すると、大量のエラーが発生します。

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

于 2012-07-23T12:31:14.530 に答える