我有一種csv文件,帶有一些額外的參數。我不想寫我自己的解析器,因爲我知道那裏有很多好的解析器。問題是,如果有任何解析器可以處理我的場景,我就不會知道。 我的CSV文件看起來像這樣:解析一種csv文件
我想先閱讀以下#ADM第二線所以在這種情況下,3線。我想在#Prov。之後閱讀第二行。
是否有任何優秀的解析器或讀者可以使用它來幫助我,以及如何編寫來處理我的場景?
我的文件的擴展名不是.csv,也是.lab,但我想這不會是一個問題?
我有一種csv文件,帶有一些額外的參數。我不想寫我自己的解析器,因爲我知道那裏有很多好的解析器。問題是,如果有任何解析器可以處理我的場景,我就不會知道。 我的CSV文件看起來像這樣:解析一種csv文件
我想先閱讀以下#ADM第二線所以在這種情況下,3線。我想在#Prov。之後閱讀第二行。
是否有任何優秀的解析器或讀者可以使用它來幫助我,以及如何編寫來處理我的場景?
我的文件的擴展名不是.csv,也是.lab,但我想這不會是一個問題?
Fore,我沒有看到該任務的spefic語言,並閱讀了太晚c#
。這裏有一個perl
解決方案,但有很好的評論,所以我希望它可以很有用並且很容易翻譯成其他語言。
假設一個測試文件(infile
)像:
script.pl
1
2
3
4
5
#Adm
6
7
#Prov
8
9
#Adm
10
11
#Prov
12
13
#Adm
14
15
#Prov
16
17
:
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
謝謝你。完成編寫我自己的解析器,並使用這些代碼。 – Fore
閱讀下面的第二行會有什麼好處...? –
什麼語言?你應該只寫你自己的解析器。這將是快速和容易的。你可以在你得到答案的時候完成它,並學習這裏推薦的任何工具。 –
如果這是在Linux/UNIX系統上,您可能可以使用像sed或awk這樣的工具來完成大部分或全部工作。 –