我认为这会非常容易,但我很难过。我想将每行放在一个文件中并复制八次。这是我正在使用的代码:
#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;
my $inputFile = "Providers list.csv";
my $outputFile = "Providers list2.csv";
open my $FHI, '<', $inputFile || die "cannot open input file";
open my $FHO, '>', $outputFile || die "cannot open output file";
while (<$FHI>) {
for ( my $i = 0; $i < 8; $i++) {
print $FHO "$_\r";
}
}
close $inputFile;
close $outputFile;
正在发生的事情是,每次重复八次,重复整个文件内容八次。换句话说,而不是:
Line1
Line1
Line1
Line1
Line1
Line1
Line1
Line1
我得到了这个:
Line1
Line2
Line3
Line1
Line2
Line3
等等,八次。我不明白为什么它不是单独处理每一行。
TIA!
答案 0 :(得分:6)
如果源文件也有Mac行结尾,请尝试在脚本开头用$/ = "\r"
设置输入记录分隔符。如果这是问题所在,那么只要您没有\r
数据,就不需要在输出中打印chomp
。
答案 1 :(得分:3)
您可能正在非Mac平台上阅读Mac文件。
在这种情况下,另一种选择是在脚本之外转换行结尾:它的优点是脚本本身可以在任何平台/源文件组合上不加改变地执行,但当然它更慢(与Andy的建议相比) )。
它包含三个步骤:首先是换行符(假设你在* nix上):
perl -pe 's/\r/\n/g' macfile.csv > unixfile.csv
然后你的脚本(打印时没有附加\r
,如Andy所说),或者只是从命令行:
perl -l0ne 'print "$_\n" x 8' unixfile.csv > unixfile8.csv
如果您确定原始文件以换行符终止,则可以进一步缩小为:
perl -ne 'print $_ x 8' unixfile.csv > unixfile8.csv
最后:
perl -pe 's/\n/\r/g' unixfile8.csv > macfile8.csv
关于您的脚本:请记住,use diagnostics
也会自动激活warnings
,并且Perl变量名称的首选样式为$all_lowercase_with_underscore
。
答案 2 :(得分:1)
x
运算符可用于多次打印,所以
print $_ x 8;