0

いくつかのデータを含むテキストファイルがあります。ID列のみでEAを検索しようとしていますが 、行全体が出力されます。ただし、コードはすべてのEAを認識し、すべての行を出力します。条件を満たすためにどのコードを追加する必要がありますか?再度、感謝します:-)!

データ:
名前年齢ID
---------------------
KRISTE、22、EA 2008
J EA N、21、ES4567
JAK、45、EA 2008

コードは次のように出力します:
KRISTE 、22、EA 2008
J EA N、21、ES4567
JAK、45、EA 2008

必要な出力:
KRIS、22、EA 2008
Kane、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>";
}
4

6 に答える 6

8

ブライアンとジェレミーのコードを組み合わせると、すべての問題が修正されます。

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');が、質問に当てはまるとは思わなかったので、それを元に戻しました。

于 2008-11-04T07:35:11.287 に答える
6

問題を説明するために使用している実際のサンプル プログラムを投稿する必要があります。クリーンアップされたプログラムは次のとおりです。

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 変数は必要ありません。
  • 空白を使用して、ステートメントに息を吹き込む余地を与えます。結局のところ、それは無料です。
于 2008-11-04T07:21:21.020 に答える
4

あなたはほとんどそれを持っていました、私はこれがうまくいくはずだと思います:

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>";
  }
}

これにより、最初に行が列に分割され、次に3番目の列でのみ正規表現が実行されます。

ところで、あなたのコードには他の問題があるかもしれません(例えば、それらのprintステートメントはあなたの変数の値を出力するようには見えません)が、私はperlをよく知らないのであなたの主な質問に答えただけです...

于 2008-11-04T05:35:30.810 に答える
2

自分で 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
于 2008-11-06T06:23:15.003 に答える
1

または、リストの 3 番目の項目と一致するように正規表現を変更することもできます。

/[^,]*,[^,]*,.*EA/
于 2008-11-04T16:01:49.360 に答える
0

あなたの正規表現は、あなたがやろうとしていることに対して正しくありません。ベンの解決策は機能しますが、先頭に ^ もある必要があります。これにより、正規表現が文字列の先頭から一致を開始することが保証されます。

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

また、perl の観点からすると、あなたのコードはちょっとうるさいです。コードを読みやすくしたい場合は、これを行うことができます (私は Ben の正規表現を使用しています)。

$f = 'save.txt';

open( F, $file );

@matches = grep { /^.?,.?,.*EA/ } <F>;

これで、@matches は一致したすべてのレコードを保持するようになり、それらを使ってやりたいことができるようになりました。

于 2008-11-04T17:17:48.130 に答える