2012-05-09 127 views
1

我有一種csv文件,帶有一些額外的參數。我不想寫我自己的解析器,因爲我知道那裏有很多好的解析器。問題是,如果有任何解析器可以處理我的場景,我就不會知道。 我的CSV文件看起來像這樣:解析一種csv文件

The CSV file

我想先閱讀以下#ADM第二線所以在這種情況下,3線。我想在#Prov。之後閱讀第二行。

是否有任何優秀的解析器或讀者可以使用它來幫助我,以及如何編寫來處理我的場景?

我的文件的擴展名不是.csv,也是.lab,但我想這不會是一個問題?

+0

閱讀下面的第二行會有什麼好處...? –

+1

什麼語言?你應該只寫你自己的解析器。這將是快速和容易的。你可以在你得到答案的時候完成它,並學習這裏推薦的任何工具。 –

+0

如果這是在Linux/UNIX系統上,您可能可以使用像sed或awk這樣的工具來完成大部分或全部工作。 –

回答

0

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 
+0

謝謝你。完成編寫我自己的解析器,並使用這些代碼。 – Fore