1

我有一种 csv 文件,带有一些额外的参数。我不想编写自己的解析器,因为我知道那里有很多好的解析器。问题是,如果有任何解析器可以处理我的场景,我会感到不安。我的 csv 文件如下所示:

CSV 文件

我想先阅读 #ADM 下面的第二行,所以在这种情况下是 3 行。而我想阅读#Prov 之后的第二行。

有没有我可以使用的好的解析器或阅读器来帮助我解决这个问题,我将如何编写来处理我的场景?

我的文件的扩展名也不是 .csv ,而是 .lab ,但我想这不会有问题吗?

4

1 回答 1

0

Fore,我没有看到该任务的特定语言,并且阅读太晚了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 回答