use strict;
use warnings;
open(FILE4,"cool.txt");
open(FILE6,">./mool.txt");
$line = <FILE4>;
while ($line ne "")
{
@array = split(/,/,$line);
$line = <FILE4> ;
print FILE6 ($array[0]);
print FILE6 ("\t");
print FILE6 ($array[1]);
print FILE6 ("\t");
print FILE6 ($array[2]);
}
这是我用perl编写的代码。但是代码运行不正常。它为每个下一行提供标签空间。但我不需要每个新行的TAB空间。让我告诉你输出是如何的。
name contact email
samy 32344245 hyte@some.com
alex 231414124 coool@some.com
这就是我看到我的mool.txt文件的方式。第一行它工作正常。但是从下一行我面临标签空间。我正在试图找出错误的位置。任何人都可以让我知道在哪里代码出错了?我经历了很多次,但无法弄明白。谢谢你
有人要求我向你展示输入文件
"name","contact","email"
"samy","32344245","hyte@some.com"
答案 0 :(得分:4)
您可能在输入文件的行的开头/结尾有空格。
尝试使用s///
use strict;
use warnings;
open my $in, "<", "cool.txt" or die $!;
open my $out, ">", "mool.txt" or die $!;
while (my $line = <$in>) {
$line =~ s/^\s+|\s+$//g;
my @array = split(/,/, $line);
print $out join("\t", @array), "\n";
}
答案 1 :(得分:2)
将此语句放在while循环中。
chomp
这应该是从文件中读取一行后的第一行。这将删除不需要的空格。
use strict;
use warnings;
open(FILE4,"cool.txt");
open(FILE6,">./mool.txt");
while (<FILE4>)
{
chomp; #This will remove unwanted spaces
@array = split(/,/,$_); #$_ will represent the line which is read
print FILE6 ($array[0]);
print FILE6 ("\t");
print FILE6 ($array[1]);
print FILE6 ("\t");
print FILE6 ($array[2]);
print FILE6 ("\n");
}
答案 2 :(得分:2)
您似乎正在做的是将此文件从逗号分隔更改为制表符分隔。如果是这样,这可能是一种更简单的方法:
while (<>) {
s/,/\t/g;
print;
}
然后像这样使用它:
$ script.pl cool.txt > mool.txt
你甚至可以使用单行代码:
perl -pwe 's/,/\t/g' cool.txt > mool.txt
或者如果你有奇怪的空白:
perl -pwe 's/^\s+|\s+$//g; s/,/\t/g' cool.txt > mool.txt
或者,更安全的版本,使用Text::CSV。这将为您处理复杂数据等。如果你得到空白输出,可能是你的额外空白弄乱了。如果是这样,您可以在没有s/,/\t/g
行的情况下运行上面的单行,以获得输入文件的“清理”版本:
perl -pwe 's/^\s+|\s+$//g;' cool.txt > cool_clean.txt
脚本:
use warnings;
use strict;
use Text::CSV;
use autodie;
my $csv_in = Text::CSV->new();
my $csv_out = Text::CSV->new( { sep_char => "\t", eol => "\n" } );
open my $fh, '<', 'data.csv';
open my $out, '>', 'mool.txt';
while (my $row = $csv_in->getline($fh)) {
$csv_out->print($out, $row);
}