我有一个简单的代码,可以读取 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 之前切断空条目。
您的 YAML 并不意味着您认为的含义。[ a, b, ]只有两个元素。[ a, b ]它与YAML 允许元素尾随逗号相同。要修复您的错误,请替换
[ ..., ]
Run Code Online (Sandbox Code Playgroud)
和
[ ..., "" ]
Run Code Online (Sandbox Code Playgroud)