我对Perl相当陌生,对Perl的“适当”语法几乎一无所知。
我有一个文本文件,我每天使用的名字,以及其他信息的名单,我们的用户。该文件每天都会更改,有时其中有两行(选项卡分隔),而其他时候则有100+行。
该文件还在一行中的6-9列数据之间变化。我已经组装了一个Perl脚本,它使用选项卡上的拆分函数,但我遇到的问题是,如果我使用第a行,其中有5列,然后添加第二行b,其中有6列,这些列都是由数据填充的。
我不知道如何让Perl看到该行a只有5列数据,并从那时开始继续解析文本文件。它还在继续,但是输出奇怪地包装了线条。我怎样才能避开这个问题呢?我希望这是有意义的。
发布于 2010-11-18 22:04:36
您将不得不发布一些代码,可能还需要一些示例数据,但是下面的代码可以解析不同长度的行,而不存在任何问题。
脚本:
#!/usr/bin/perl
use strict;
while (<STDIN>)
{
chomp;
my @info = split("\t");
print join(";", @info), "\n";
}
exit;测试文件:
jsmith 101 777-222-5555 Office 1 Building 1 Manager
aposse 104 777-222-5556 Office 2 Building 2 Stock Clerk
jbraza 105 777-222-5557 Office 3
mcuzui 102 777-222-5557 Office 3 Building 3 Cashier
ghines 107 777-222-5557 Office 3输出:
%> test.pl < file.txt
jsmith;101;777-222-5555;Office 1;Building 1;Manager
aposse;104;777-222-5556;Office 2;Building 2;Stock Clerk
jbraza;105;777-222-5557;Office 3
mcuzui;102;777-222-5557;Office 3;Building 3;Cashier
ghines;107;777-222-5557;Office 3发布于 2010-11-18 22:01:43
您应该发布一些示例数据和代码,并根据代码当前的操作和希望它做什么来解释所需的行为。拆分将给出输入中的字段数。
#!/usr/bin/perl
use strict; use warnings;
while ( my $row = <DATA> ) {
last unless $row =~ /\S/;
chomp $row;
my @cells = split /\t/, $row;
print "< @cells >\n";
}
__DATA__
1 2 3 4 5
a b c d e f发布于 2010-11-19 04:10:39
案文:CSV模块也可以用于解析选项卡分隔的值。实际上,案文:CSV可以解析由任何字符分隔的值。
其POD的有关摘录:
该模块接受字符串或文件作为输入,并可以使用任何用户指定的字符作为分隔符、分隔符和转义符,因此它可能更好地称为ASV (任何分隔值),而不仅仅是CSV。
#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new( { 'sep_char' => "\t" } );
open my $fh, '<', 'data.tsv' or die "Unable to open: $!";
my @rows;
while ( my $row_ref = $csv->getline($fh) ) {
push @rows, $row_ref;
}
$csv->sep_char('|');
for my $row_ref (@rows) {
$csv->combine(@$row_ref);
print $csv->string(), "\n";
}https://stackoverflow.com/questions/4219929
复制相似问题