【发布时间】:2015-09-01 06:28:38
【问题描述】:
我有 test.dat 文件,其值如下:
20150202,abc,,,,3625.300000,,,,,-5,,,,,,,,,,,,,,,,,,,,,,
20150202,def,,,,32.585,,,,,0,,,,,,,,,,,,,,,,,,,,,,
20150202,xyz,,,,12,,,,,0.004167,,,,,,,,,,,,,,,,,,,,,,
我的预期输出如下所示:
20150202,abc,,,,3625.300000,,,,,-5.,,,,,,,,,,,,,,,,,,,,,,
^. added here
20150202,def,,,,32.585,,,,,0.,,,,,,,,,,,,,,,,,,,,,,
^. added here
20150202,xyz,,,,12.,,,,,0.004167,,,,,,,,,,,,,,,,,,,,,,
^. added here
所以如果第 6 列和第 11 列没有小数点,那么我们应该添加 '.'在文件末尾。
我尝试了下面的代码,但它在拆分期间抛出错误消息
#!/usr/bin/perl
use strict;
use warnings;
my $filename = 'test.dat';
open my $fh, $filename or die "Could not open file '$filename': $!";
my @cols_to_change = qw ( 6 11 );
while (my $val = <$fh>) {
my @row = split (/,/);
foreach my $col ( @cols_to_change ) {
unless ( $row[$col] =~ m/\./ ) { $row[$col] .= '.' }
}
print join ( ',', @row );
}
我收到的错误信息如下:
Use of uninitialized value in split at test.pl line 11, <$fh> line 1.
Use of uninitialized value in pattern match (m//) at test.pl line 13, <$fh> line 1.
Use of uninitialized value in pattern match (m//) at test.pl line 13, <$fh> line 1.
Use of uninitialized value in join or string at test.pl line 15, <$fh> line 1.
....
我不允许使用任何额外的 perl 模块,例如 Text::CSV。此外,任何使用 awk 的解决方案都会有很大帮助!
【问题讨论】: