1

いくつかの追加パラメータを含む一種のcsvファイルがあります。良いパーサーがたくさんあることを知っているので、自分のパーサーを書きたくありません。問題は、私のシナリオを処理できるパーサーがあれば、私は不機嫌であるということです。私のcsvファイルは次のようになります。

CSVファイル

最初に#ADMの下の2行目を読みたいので、この場合は3行です。そして、#Provの後の2行目を読みたいと思います。

これを支援するために使用できる優れたパーサーまたはリーダーはありますか?また、シナリオを処理するためにどのように記述しますか?

私のファイルの拡張子も.csvではなく、.labですが、それは問題にならないのではないでしょうか。

4

1 に答える 1

0

に、タスクの特定の言語が表示されず、について読むのが遅すぎましたc#。これがperl解決策ですが、よくコメントされているので、便利で他の言語に簡単に翻訳できることを願っています.

infile次のようなテスト ファイル ( ) を想定します。

1
2
3
4
5

#Adm
6                                                                                                                                                                                                                                            
7                                                                                                                                                                                                                                            

#Prov                                                                                                                                                                                                                                        
8                                                                                                                                                                                                                                            
9                                                                                                                                                                                                                                            

#Adm                                                                                                                                                                                                                                         
10                                                                                                                                                                                                                                           
11                                                                                                                                                                                                                                           

#Prov                                                                                                                                                                                                                                        
12                                                                                                                                                                                                                                           
13                                                                                                                                                                                                                                           

#Adm                                                                                                                                                                                                                                         
14                                                                                                                                                                                                                                           
15                                                                                                                                                                                                                                           

#Prov                                                                                                                                                                                                                                        
16                                                                                                                                                                                                                                           
17

の内容script.pl:

use warnings;
use strict;

## Assign empty value to read file by paragraphs.
$/ = qq[];

## Arrays to save second row of its section.
my (@adm, @prov);

## Regex to match beginning of section.
my $regex = qr/(?:#(?|(Adm)|(Prov)))/;

## Read file.
while ( <> ) { 

    ## Remove last '\n'.
    chomp;

    ## If matches the section and it has at least two lines...
    if ( m/\A${regex}/ and tr/\n/\n/ == 2 ) { 

        ## Group the section name ($1) and its second line ($2).
        if ( m/\A${regex}.*\n^(.*)\Z/ms ) { 

            ## Save line in an array depending of section's value.
            if ( $1 eq q[Adm] ) { 
                push @adm, $2; 
            }   
            elsif ( $1 eq q[Prov] ) { 
                push @prov, $2; 
            }   
        }   
    }   
}

## Print first lines of 'Adm' section and later lines of 'Prov' section.
for ( ( @adm, @prov ) ) { 
    printf qq[%s\n], $_; 
}

exit 0;

次のように実行します。

perl script.pl infile

次の出力で:

7
11
15
9
13
17
于 2012-05-09T14:42:54.990 に答える