我有一种 csv 文件,带有一些额外的参数。我不想编写自己的解析器,因为我知道那里有很多好的解析器。问题是,如果有任何解析器可以处理我的场景,我会感到不安。我的 csv 文件如下所示:
我想先阅读 #ADM 下面的第二行,所以在这种情况下是 3 行。而我想阅读#Prov 之后的第二行。
有没有我可以使用的好的解析器或阅读器来帮助我解决这个问题,我将如何编写来处理我的场景?
我的文件的扩展名也不是 .csv ,而是 .lab ,但我想这不会有问题吗?
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