Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用Text::CSV::Slurp将哈希转换为CSV_Perl_Csv - Fatal编程技术网

Perl 使用Text::CSV::Slurp将哈希转换为CSV

Perl 使用Text::CSV::Slurp将哈希转换为CSV,perl,csv,Perl,Csv,我有一个Perl哈希,需要将其写入JSON和CSV格式 我的散列的打印转储程序\%formdata如下所示 $VAR1 = { 'SPRequest' => { 'xrelease' => '13038', 'macaddr' => '47:00:11:22:00:30', 'na

我有一个Perl哈希,需要将其写入JSON和CSV格式

我的散列的打印转储程序\%formdata如下所示

$VAR1 = {
          'SPRequest' => {
                              'xrelease' => '13038',
                              'macaddr' => '47:00:11:22:00:30',
                              'name' => 'localhost',
                              'description' => 'demo'
                            },
          '.submit' => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
          'class' => 'SPRequest',
          '22406' => {
                       'win.profile' => 'production',
                       'win.os_version' => 'standard',
                       'win.os_part_size' => '1'
                     }
        };
下面是我用来生成json文件的代码片段

my $form_data_file = "/tmp/${hostname}_${macaddr}.json";
open FH, ">$form_data_file" or die "Could not open $form_data_file. :$!\n";
print FH to_json( \%formdata, {pretty=>1} );
close FH;
我可以将我的JSON输出到如下文件:

[red@tools-dev1 psong]$ cat /tmp/localhost_47-00-11-22-00-30.json 
{
   "SPRequest" : {
      "xrelease" : "13038",
      "macaddr" : "47:00:11:22:00:30",
      "name" : "localhost",
      "description" : "demo"
   },
   ".submit" : true,
   "class" : "SPRequest",
   "22406" : {
      "win.profile" : "production",
      "win.os_version" : "standard",
      "win.os_part_size" : "1"
   }
}
[red@tools-dev1 psong]$ cat /tmp/localhost_47-00-11-22-00-30.csv ; echo
.submit,22406,SPRequest,class
true,HASH(0x8d81918),HASH(0x8d67980),SPRequest
以下是我用来创建CSV文件的代码:

my $form_data_file_csv = "/tmp/${hostname}_${macaddr}.csv";
# Text::CSV::Slurp wants arrayref of hashref
my $ARoHR = [ \%formdata ];
my $csv = Text::CSV::Slurp->create( input => $ARoHR);
open FH, ">$form_data_file_csv" or die "Could not open $form_data_file_csv. :$!\n";
print FH $csv;
close FH;
但问题是我的CSV文件最终看起来是这样的:

[red@tools-dev1 psong]$ cat /tmp/localhost_47-00-11-22-00-30.json 
{
   "SPRequest" : {
      "xrelease" : "13038",
      "macaddr" : "47:00:11:22:00:30",
      "name" : "localhost",
      "description" : "demo"
   },
   ".submit" : true,
   "class" : "SPRequest",
   "22406" : {
      "win.profile" : "production",
      "win.os_version" : "standard",
      "win.os_part_size" : "1"
   }
}
[red@tools-dev1 psong]$ cat /tmp/localhost_47-00-11-22-00-30.csv ; echo
.submit,22406,SPRequest,class
true,HASH(0x8d81918),HASH(0x8d67980),SPRequest
我做错了什么

更新:看起来我做错了,我希望Text::CSV::Slurp能够处理散列。因此,我推出了自己的:

my @cols;
my @row;
sub hash2cvs {
        my $h = shift;
        my $p = shift || 'top';
        foreach my $k ( keys %{$h} ) {
                if (ref $h->{$k} eq ref {}) {
                        hash2cvs( $h->{$k}, $k );
                } else {
                        if ( $p eq 'top' ) {
                                push @cols, $k;
                        } else {
                                push @cols, "$p.$k";
                        }
                        push @row, $h->{$k};
                }
        }
}
my @cols;
my @row;
sub hash2cvs {
        my $h = shift;
        my $p = shift || 'top';
        foreach my $k ( keys %{$h} ) {
                if (ref $h->{$k} eq ref {}) {
                        hash2cvs( $h->{$k}, ($p eq 'top') ? $k : "$p.$k" );
                } else {
                        if ( $p eq 'top' ) {
                                push @cols, $k;
                        } else {
                                push @cols, "$p.$k";
                        }
                        push @row, $h->{$k};
                }
        }
}

看起来我做错了,期待Text::CSV::Slurp处理散列。因此,我推出了自己的:

my @cols;
my @row;
sub hash2cvs {
        my $h = shift;
        my $p = shift || 'top';
        foreach my $k ( keys %{$h} ) {
                if (ref $h->{$k} eq ref {}) {
                        hash2cvs( $h->{$k}, $k );
                } else {
                        if ( $p eq 'top' ) {
                                push @cols, $k;
                        } else {
                                push @cols, "$p.$k";
                        }
                        push @row, $h->{$k};
                }
        }
}
my @cols;
my @row;
sub hash2cvs {
        my $h = shift;
        my $p = shift || 'top';
        foreach my $k ( keys %{$h} ) {
                if (ref $h->{$k} eq ref {}) {
                        hash2cvs( $h->{$k}, ($p eq 'top') ? $k : "$p.$k" );
                } else {
                        if ( $p eq 'top' ) {
                                push @cols, $k;
                        } else {
                                push @cols, "$p.$k";
                        }
                        push @row, $h->{$k};
                }
        }
}

数据::如果您向转储程序输出传递一个引用(例如打印转储程序\%hash);而不是打印转储程序%hash;很公平。更新的OPI如果要将包含对象的嵌套数据结构映射到平面CSV文件,则必须决定映射的工作方式。例如,是否希望将列命名为SPRequest\u xrelease、SPRequest\u macaddr、SPRequest\u name等等?对象应该如何字符串化?Text::CSV::Slurp怎么可能知道要如何将任意深度的数据结构映射到平面文件?这是没有标准的;如何将{foo=>bar=>[42,baz=>{qux=>17}]}表示为CSV?JSON规范包含数组和对象,因此更简单,尽管不是没有困难。@RedCricket:该站点使用一些自定义JavaScript创建嵌套JSON数据到CSV格式的任意映射。它是不可靠的,远不是一个标准,你不应该期望任何其他软件在任何语言复制它