我在下面有一个相对简单的分割/连接脚本。第一部分删除了我的数据中的标题行第二部分是拆分\ t分隔文件并重新加入我选择的模板序列。在我加入字段后,我可以对任何重新加入的单个字段做任何事情吗?
当我运行这样的代码时,它只会执行脚本的第一部分,即连接。有什么建议吗?
示例数据
Id Name date amount me/you
1 jim 10/31/2014 78392 you
1 jim 10/31/2014 0 you
所需的输出
y,1,jim,2014-10-31,78392,yes
初始代码
while (<>) {
print and next if s/(^Pre-exisitng_Header_row*?\n|^$|^\s$)//; ##gets rid of header row/blanks
my @flds = split /\t/; ##initiates split
print join ",", @flds[5,1,2,3,4,5]; ##re joins to my liking.
}
所需代码
use text::trim
while (<>) {
print and next if s/(^Pre-exisitng_Header_row*?\n|^$|^\s$)//; ##gets rid of header/blanks.
my @flds = split /\t/; ##initiates split
trim for @flds[0,2..$#flds];
print join ",", @flds[5,1,2,3,4,5]; ##re joins to my liking. to retain $[5] as is
print if ($flds[4] != 0) ##after re joining, print if $[4] is not = to 0.
if ($flds[3] =~ s/(\d+)\/(\d+)\/(\d+)/$3-$1-$2/; ##do a regex on [3]
$flds[0] = "Y" if $flds[0] =~ /you/; ##do a substitution on [0]
print @flds;
}
进一步说明
基本上我想做的就是拆分并重新加入我的数据到某个模板。在这个模板之后,我想修改字段。例如,你可以看到我想打印当且仅当$ [4]不等于0.其次我想确保日期是yyyy-mm-dd格式$ [3]。最后,我想将$ [0]从Yes替换为'Y',同时在我的新模板的最后一个字段中保留'Yes'($ [5])。
答案 0 :(得分:0)
您可以对@flds数组的成员执行任何操作。
print join ",", @flds[1,2,3,4,5];
不修改@flds数组
答案 1 :(得分:0)
这是让你开始的东西。您还没有提到Y
或Yes
关键字的位置,因为您的输入数据似乎没有。此外,还不是很清楚是否要按原样打印标题和空白行,或者您想要从输出中删除它们。我已经选择了后者,但如果你需要前者,它应该是一个简单的解决方案。还要记住,数组的索引从0
开始。因此,您的第一列是array[0]
,而不是array[1]
。
要回答有关特定列为0的过滤行以及对某些数组元素执行更改的主要问题,以下内容应该为您提供一些想法:
use strict;
use warnings;
while(<DATA>) {
next if /^\s+$|^\s*Id/;
chomp;
my @flds = split /\t/;
next if $flds[3] eq 0;
$flds[2] =~ s|(\d{2})/(\d{2})/(\d{4})|$3-$1-$2|;
my $pre = "y" if $flds[4] eq "you";
print join (",", $pre //= "", @flds) , "\n";
}
__DATA__
Id Name date amount me/you
1 jim 10/31/2014 78392 you
1 jim 10/31/2014 0 you
y,1,jim,2014-10-31,78392,you
要为该行添加前缀,您只需创建一个新变量,并根据该列的值设置它的值。 //=
是已定义的或运算符。如果定义了变量的值,它将使用它。而不是""
,您可以设置一个默认值,它可以在未定义时使用。
使用正则表达式的另一种方法是split
。您可以从上面的代码中删除最后两行,并将其替换为以下内容。
my @dates = split /\//, $flds[2];
print join (",", @flds[0..1], join ("-", @dates[2,0,1]), @flds[3..4]), "\n";