这是我的制表符分隔输入文件
Name<tab>Street<tab>Address这就是我希望的输出文件的样子
Street<tab>Address<tab>Address(是的,重复接下来的两列)我的输出文件如下所示
Street<tab>Address
<tab>Addressperl是怎么回事?这是我的代码。
open (IN, $ARGV[0]);
open (OUT, ">output.txt");
while ($line = <IN>){
chomp $line;
@line=split/\t/,$line;
$line[2]=~s/\n//g;
print OUT $line[1]."\t".$line[2]."\t".$line[2]."\n";
}
close( OUT);发布于 2013-10-08 22:32:10
首先,你应该始终
即使是最琐碎的程序,也可以使用
use strict和use warnings。您还需要使用my声明每个变量,以尽可能接近它们的第一次使用my表示每次open调用成功,并使用包含$!的字符串声明die,以显示失败的原因
另请注意,不需要显式打开命令行上指定的文件,这些文件出现在@ARGV中:您只需使用<>读取它们即可。
正如其他人所说,看起来您正在读取Linux系统上的DOS或Windows源文件。您可以使用s/\s+\z//从每一行中删除所有尾随空格字符,而不是使用chomp。因为CR和LF都算作“空白”,所以这将从每条记录中删除所有的行终止符。但是,请注意,如果尾部空格很重要,或者最后一个字段可能为空,则这也会删除空格和制表符。在这种情况下,s/[\r\n]+\z//更合适。
这个版本的程序运行得很好。
use strict;
use warnings;
@ARGV = 'addr.txt';
open my $out, '>', 'output.txt' or die $!;
while (<>) {
s/\s+\z//;
my @fields = split /\t/;
print $out join("\t", @fields[1, 2, 2]), "\n";
}
close $out or die $!;发布于 2013-10-08 22:46:56
如果您事先知道数据文件的来源,并且知道它是一个使用CR LF终止记录的类DOS文件,则可以在打开该文件时使用PerlIO crlf层。像这样
open my $in, '<:crlf', $ARGV[0] or die $!;然后,当在Linux系统上读取所有记录时,它们将显示为仅以"\n"结尾。
此问题的一般解决方案是安装PerlIO::eol。然后你就可以写
open my $in, '<:raw:eol(LF)', $ARGV[0] or die $!;无论文件的来源如何,也不管运行"\n"的平台是什么,行的结尾都将始终为Perl。
发布于 2013-10-08 15:19:00
您是否尝试过不仅要删除"\n“,还要删除”\r“?
$file[2] =~ s/\r\n//g;
$file[3] =~ s/\r\n//g; # Is it the "good" one?这能行得通。DOS行结尾也可以是"\r“(不仅仅是"\n")。
https://stackoverflow.com/questions/19238897
复制相似问题