使用Perl复制文件中的行

时间:2011-05-02 04:30:20

标签: perl

我认为这会非常容易,但我很难过。我想将每行放在一个文件中并复制八次。这是我正在使用的代码:

#!/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!

3 个答案:

答案 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

另请查看Perl newlines across different platforms

答案 2 :(得分:1)

x运算符可用于多次打印,所以

print $_ x 8;