如果空数组条目位于数组末尾,YAML 将忽略它们

Har*_*ear 3 perl yaml

我有一个简单的代码,可以读取 YAML 文件并将其转储回 CSV:

my @data = YAML::LoadFile(${$testplan_path});
    foreach (@{$data[0]}) {
      print "HERE\n";
      print Dumper $_;
      print "\n";
      # Print each yaml array into a csv
      $csv->print($CSVFILE, $_);
      # Add new line
      print $CSVFILE "\n";
    }
Run Code Online (Sandbox Code Playgroud)

除了 YAML 文件在数组末尾有空条目的情况之外,这种方法工作得很好。

- [Title                             ,Description   ,Type       ,Data                     ,Owner    ,Milestone   ,Tags            ]
- [gfc200 Testplan                   ,              ,Header     ,1                        ,         ,            ,"ONE,TWO"       ]
- [Design Checks                     ,              ,testplan   ,design_checks.yaml       ,harwhi01 ,            ,                ]
Run Code Online (Sandbox Code Playgroud)

上述 3 行 YAML 的 print/dump 输出如下:

HERE
$VAR1 = [
          'Title',
          'Description',
          'Type',
          'Data',
          'Owner',
          'Milestone',
          'Tags'
        ];

HERE
$VAR1 = [
          'gfc200 Testplan',
          '',
          'Header',
          '1',
          '',
          '',
          'ONE,TWO'
        ];

HERE
$VAR1 = [
          'Design Checks',
          '',
          'testplan',
          'design_checks.yaml',
          'harwhi01',
          ''
        ];
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Perl 按预期解释了前两个条目,但第三行缺少一个额外的空字符串,因为它应该如下所示:

$VAR1 = [
          'Design Checks',
          '',
          'testplan',
          'design_checks.yaml',
          'harwhi01',
          '',
          ''
        ];
Run Code Online (Sandbox Code Playgroud)

在 csv 文件中,输出为:

Title,Description,Type,Data,Owner,Milestone,Tags
"gfc200 Testplan",,Header,1,,,"ONE,TWO"
"Design Checks",,testplan,design_checks.yaml,harwhi01,
Run Code Online (Sandbox Code Playgroud)

它应该在哪里:

Title,Description,Type,Data,Owner,Milestone,Tags
"gfc200 Testplan",,Header,1,,,"ONE,TWO"
"Design Checks",,testplan,design_checks.yaml,harwhi01,,
Run Code Online (Sandbox Code Playgroud)

输出的每行列数必须一致,这一点很重要。

我该如何解决这个问题?

$csv是 module use Text::CSV;,但这并不是特别重要。正如我在 STDOUT 中所示,yaml 解释器正在将 yaml 文件读入数据结构,并在转储到 CSV 之前切断空条目。

ike*_*ami 7

您的 YAML 并不意味着您认为的含义。[ a, b, ]只有两个元素。[ a, b ]它与YAML 允许元素尾随逗号相同。要修复您的错误,请替换

[ ...,                ]
Run Code Online (Sandbox Code Playgroud)

和

[ ..., ""             ]
Run Code Online (Sandbox Code Playgroud)