Как я могу правильно обработать этот файл, содержащий разделенные табуляцией значения в Perl? - PullRequest
0 голосов
/ 19 ноября 2010

Я довольно новичок в Perl и почти ничего не знаю о «правильном» синтаксисе Perl.

У меня есть текстовый файл, который я использую каждый день со списком имен и другой информацией для наших пользователей.Этот файл меняется ежедневно и иногда содержит две строки (разделенные табуляцией), а иногда более 100 строк.

Файл также варьируется между 6-9 столбцами данных в строке.Я собрал Perl-скрипт, который использует функцию разделения на вкладках, но проблема, с которой я сталкиваюсь, заключается в том, что если я возьму строку a , в которой есть 5 столбцов, а затем добавлю вторую строку b , в котором есть 6 столбцов, заполненных данными.

Я не могу понять, как заставить Perl увидеть, что строка a имеет только 5 столбцов данных, и продолжить анализ текстового файла с этого момента.Это продолжается, но вывод странно переносит строки.Как я могу обойти эту проблему?Я надеюсь, что это имело смысл.

Ответы [ 3 ]

4 голосов
/ 19 ноября 2010

Вам придется опубликовать некоторый код и, возможно, некоторые примеры данных, но вот код, который без проблем разбирает строки различной длины.

Сценарий:

#!/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
1 голос
/ 19 ноября 2010
Модуль

Text :: CSV также может использоваться для анализа значений, разделенных табуляцией.В действительности, Text :: CSV может анализировать значения, разделенные любым символом.

Соответствующая выдержка из его POD:

Модуль принимает строки или файлы какinput и может использовать любые заданные пользователем символы в качестве разделителей, разделителей и экранированных символов, поэтому, возможно, лучше называть их 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";
}
1 голос
/ 19 ноября 2010

Вы должны опубликовать некоторые примеры данных и кода и объяснить желаемое поведение с точки зрения того, что код делает в настоящее время и что вы хотите, чтобы он делал. split даст вам столько полей, сколько имеется на входе.

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...