首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确处理这个包含Perl选项卡分隔值的文件?

如何正确处理这个包含Perl选项卡分隔值的文件?
EN

Stack Overflow用户
提问于 2010-11-18 21:49:37
回答 3查看 1.6K关注 0票数 0

我对Perl相当陌生,对Perl的“适当”语法几乎一无所知。

我有一个文本文件,我每天使用的名字,以及其他信息的名单,我们的用户。该文件每天都会更改,有时其中有两行(选项卡分隔),而其他时候则有100+行。

该文件还在一行中的6-9列数据之间变化。我已经组装了一个Perl脚本,它使用选项卡上的拆分函数,但我遇到的问题是,如果我使用第a行,其中有5列,然后添加第二行b,其中有6列,这些列都是由数据填充的。

我不知道如何让Perl看到该行a只有5列数据,并从那时开始继续解析文本文件。它还在继续,但是输出奇怪地包装了线条。我怎样才能避开这个问题呢?我希望这是有意义的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-18 22:04:36

您将不得不发布一些代码,可能还需要一些示例数据,但是下面的代码可以解析不同长度的行,而不存在任何问题。

脚本:

代码语言:javascript
复制
#!/usr/bin/perl
use strict;

while (<STDIN>)
{
    chomp;
    my @info = split("\t");
    print join(";", @info), "\n";
}

exit;

测试文件:

代码语言:javascript
复制
  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

输出:

代码语言:javascript
复制
%> 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
票数 4
EN

Stack Overflow用户

发布于 2010-11-18 22:01:43

您应该发布一些示例数据和代码,并根据代码当前的操作和希望它做什么来解释所需的行为。拆分将给出输入中的字段数。

代码语言:javascript
复制
#!/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
票数 1
EN

Stack Overflow用户

发布于 2010-11-19 04:10:39

案文:CSV模块也可以用于解析选项卡分隔的值。实际上,案文:CSV可以解析由任何字符分隔的值。

其POD的有关摘录:

该模块接受字符串或文件作为输入,并可以使用任何用户指定的字符作为分隔符、分隔符和转义符,因此它可能更好地称为ASV (任何分隔值),而不仅仅是CSV。

代码语言:javascript
复制
#!/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";
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4219929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档