用Perl复制文件中的行
我原以为这会很容易,但我被难倒了。我想把每一行都放在一个文件中,并复制八次。以下是我正在使用的代码:用Perl复制文件中的行,perl,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 f
#!/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
Line2
Line3
Line1
Line2
Line3
等等,八次。我不明白为什么它不单独处理每一行
蒂亚 如果源文件也有Mac行结尾,请尝试在脚本开始处使用
$/=“\r”
设置输入记录分隔符。如果这就是问题所在,那么您不需要也打印带有输出的\r
,只要您没有chomp
ed数据。如果源文件也有Mac行结尾,请尝试在脚本开始处将输入记录分隔符设置为$/=“\r”
。如果这就是问题所在,那么您不需要打印带有输出的\r
,只要您没有chomp
读取数据。您可能正在非Mac平台上读取Mac文件
在这种情况下,另一种选择是在脚本之外转换行结尾:它的优点是脚本本身可以在任何平台/源文件组合上不受更改地执行,但当然速度较慢(与Andy的建议相比)
它包括三个步骤:首先是换行符转换(假设您在*nix上):
然后是您的脚本(打印时不添加\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
关于您的脚本:请记住使用诊断
也会自动激活警告
,Perl变量名的首选样式是$all\u lowercase\u加下划线
还可以查看一下您可能正在非Mac平台上读取Mac文件 在这种情况下,另一种选择是在脚本之外转换行结尾:它的优点是脚本本身可以在任何平台/源文件组合上不受更改地执行,但当然速度较慢(与Andy的建议相比) 它包括三个步骤:首先是换行符转换(假设您在*nix上): 然后是您的脚本(打印时不添加
\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
关于您的脚本:请记住使用诊断
也会自动激活警告
,Perl变量名的首选样式是$all\u lowercase\u加下划线
还可以查看操作符
x
可以用于多次打印某些内容,因此
print $_ x 8;
x
操作符可用于多次打印某些内容,因此
print $_ x 8;
为什么要在循环中打印回车(
“\r”
)呢?因为该文件将在运行经典Mac OS的系统上使用,该系统使用回车作为行尾。您应该关闭$FHI
和$FHO
,而不是关闭文件名。不过,这并不是你的bug的来源。否则,我认为@Andy会给你你需要的答案-你实际上只在阅读中的“一行”,这就是整个文件,导致你看到的行为。一个小评论:open$fd,“你为什么要打印回车(”\r“
)在您的循环中?因为该文件将在运行经典Mac OS的系统上使用,该系统在行尾使用回车符。您应该关闭$FHI
和$FHO
,而不是文件名。不过,这不是您的错误来源。否则,我认为@Andy正在给您所需的答案-您实际上只读取了“一个”行,这是整个文件,导致您看到的行为。一个小评论:open$fd,“谢谢,我忘了。谢谢,我忘了。谢谢您的详细回复。谢谢您的详细回复。”。