Как я могу найти конкретный столбец в Perl? - PullRequest
0 голосов
/ 04 ноября 2008

У меня есть текстовый файл, который содержит некоторые данные. Я пытаюсь найти советник только в столбце ID и печатает всю строку Но код распознает все советники и печатает все строки. Какой код я должен добавить, чтобы удовлетворить условие? Еще раз спасибо: -)!

ДАННЫЕ:
Имя Возраст ID
---------------------
KRISTE, 22 * ​​1008 * EA 2008
J 1012 * EA * N, 21, ES4567
ЯК, 45 EA 2008

Код распечатывается:
KRISTE, 22 * ​​1019 * EA
2008
J * * ЕА тысяча двадцать-дв * +1023 * N, 21, ES4567
ЯК, 45 EA 2008

Желаемый вывод:
KRIS, 22 * ​​1031 * EA 2008
Кейн, 45 EA 2008

file='save.txt';
open(F,$file)||die("Could not open $file");
while ($line=<F>){
if ($line=~ m/$EA/i) {
my @cells=($f1,$f2,$f3)= split ',',$line;
print "<TD>f1</TD>";
print "<TD>f2</TD>";
print "<TD>f3</TD>";
}

Ответы [ 6 ]

8 голосов
/ 04 ноября 2008

Комбинация кода Брайана и Джереми решает все проблемы:

use strict;
use warnings;

my $file = 'save.txt';
open my $fh, "<", $file or die "Could not open $file: $!";

while ($line = <$fh>)
{
    my($f1, $f2, $f3) = split ',', $line;
    if ($f3 =~ m/EA/i)
    {
        print "<TD>$f1</TD>";
        print "<TD>$f2</TD>";
        print "<TD>$f3</TD>";
    }
}

Брайан обобщил образец совпадения с use CGI; и my $EA = param('keyword');, но я отменил это, поскольку не видел его применимым к вопросу.

6 голосов
/ 04 ноября 2008

Вы должны опубликовать пример программы, которую вы используете, чтобы проиллюстрировать проблему. Вот ваша очищенная программа:

use strict;
use warnings;

use CGI;

my $EA = param('keyword');

my $file = 'save.txt';
open my $fh, "<", $file or die "Could not open $file: $!";

while( $line=<$fh> ) {
   if( $line=~ m/$EA/i ) {
       my( $f1, $f2, $f3 ) = split ',', $line;
       print "<TD>$f1</TD>";
       print "<TD>$f2</TD>";
       print "<TD>$f3</TD>";
       }
   }

Вот несколько вещей, которые могут вам помочь.

  • Вашим переменным нужны их сигилы. Они ничего не делают без них.
  • Когда вы пытаетесь открыть файл и хотите сообщить об ошибке, включите $! переменная, так что вы видите, что ошибка.
  • Вы можете разделить непосредственно на скалярные переменные. Это просто список назначений. Вам не нужна дополнительная переменная @cell.
  • Дайте вашим высказываниям некоторое пространство для дыхания, используя пробелы. В конце концов, это бесплатно.
4 голосов
/ 04 ноября 2008

У вас это почти получилось, я думаю, что это должно работать:

file='save.txt';
open(F,$file)||die("Could not open $file");

while ($line=<F>){
  my @cells=($f1,$f2,$f3)= split ',',$line;
  if ($f3=~ m/$EA/i) {
    print "<TD>f1</TD>";
    print "<TD>f2</TD>";
    print "<TD>f3</TD>";
  }
}

Это разбивает строку на столбцы сначала , а затем выполняет регулярное выражение только в третьем столбце.

Кстати, у вашего кода могут быть другие проблемы (например, эти операторы печати не выглядят так, как будто они печатают значения ваших переменных), но я не очень хорошо знаю Perl, поэтому я только ответил на ваш главный вопрос ...

2 голосов
/ 06 ноября 2008

Вместо того, чтобы пытаться выполнить анализ CSV самостоятельно, используйте отличный и эффективный Text :: CSV_XS . Это будет обрабатывать экранирование и цитирование.

#!/usr/bin/perl -w

use Text::CSV_XS;

my $csv = Text::CSV_XS->new();

# Skip to the data.
while(<DATA>) {
    last if /^-{10,}$/;
}

while( my $row = $csv->getline(*DATA) ) {
    print "@$row\n" if $row->[2] =~ /EA/;
}


__DATA__
Name Age ID
---------------------
KRISTE,22,EA2008
J**EA**N,21,ES4567
JAK,45,EA2008
1 голос
/ 04 ноября 2008

Кроме того, вы можете изменить свое регулярное выражение так, чтобы оно совпадало с третьим элементом в списке:

/[^,]*,[^,]*,.*EA/
0 голосов
/ 04 ноября 2008

Ваше регулярное выражение неверно для того, что вы пытаетесь сделать. Решение Бена работает, хотя в начале также должен присутствовать символ ^, который гарантирует, что регулярное выражение начнет совпадать с начала строки:

/ ^. ?,. ?,. * EA /

Кроме того, ваш код довольно шумный с точки зрения perl. Если вы хотите, чтобы ваш код было легче читать, вы можете сделать это (я использую регулярное выражение Бена):

$f = 'save.txt';</p> <p>open( F, $file );</p> <p>@matches = grep { /^.<em>?,.</em>?,.*EA/ } <F>;

Теперь @matches будет хранить все ваши сопоставленные записи, вы можете делать с ними все, что хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...