Perl中YAML加载忽略数组末尾空元素致CSV列数不一致如何解决?
解决YAML解析末尾空元素丢失导致CSV列数不一致的问题
问题场景
使用Perl的YAML::LoadFile读取YAML文件并转换为CSV输出时,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"; }
问题YAML内容
- [Title ,Description ,Type ,Data ,Owner ,Milestone ,Tags ] - [gfc200 Testplan , ,Header ,1 , , ,"ONE,TWO" ] - [Design Checks , ,testplan ,design_checks.yaml ,harwhi01 , , ]
错误CSV输出
Title,Description,Type,Data,Owner,Milestone,Tags "gfc200 Testplan",,Header,1,,,"ONE,TWO" "Design Checks",,testplan,design_checks.yaml,harwhi01,
期望CSV输出
Title,Description,Type,Data,Owner,Milestone,Tags "gfc200 Testplan",,Header,1,,,"ONE,TWO" "Design Checks",,testplan,design_checks.yaml,harwhi01,,
解决方案
方案1:修改YAML文件,显式保留末尾空元素
YAML解析器默认忽略数组末尾的空元素,只需将末尾空元素标记为显式空字符串即可:
- [Design Checks , ,testplan ,design_checks.yaml ,harwhi01 , , "" ]
修改后解析器会保留完整的7个元素,最后一个为空字符串,CSV输出列数自动匹配。
方案2:在Perl代码中自动补全缺失元素
若无法修改原始YAML文件,可在代码中基于表头列数补全每行的元素:
my @data = YAML::LoadFile(${$testplan_path}); # 获取表头的列数(假设第一行为表头) my $target_col_count = scalar @{$data[0][0]}; foreach my $row (@{$data[0]}) { # 补全空元素直到列数匹配目标值 while (scalar @$row < $target_col_count) { push @$row, ''; } $csv->print($CSVFILE, $row); print $CSVFILE "\n"; }
此方法会自动补全每行缺失的末尾空元素,确保所有行的列数与表头一致,无需修改原始YAML文件。
内容的提问来源于stack exchange,提问作者Harry Whitnear
相关产品推荐
相关产品推荐

