2012-05-09 21 views
1

私はcsvファイルの種類を持っていますが、いくつかの追加パラメータがあります。私はそこに良いものがたくさんあることを知っているので、私は自分のパーサーを書くことを望まない。問題は、自分のシナリオを処理できるパーサーがあれば、私は驚くべきことではないということです。 私のcsvファイルは次のようになります。種類のCSVファイルの解析

The CSV file

私が最初にこのケースではそう3行を#のADM下の2番目の行を読みたいです。そして、#Provの後に2行目を読んでみたいと思います。

私にはこれに役立つパーサーや読者がありますか?自分のシナリオを処理するためにどのように書きますか?

私のファイルの拡張子は.csvでもなく、.labですが、問題ではないと思いますか?

+0

下の2行目を読むとどんなメリットがありますか? –

+1

どのような言語ですか?あなたは自分のパーサを書くだけでよい。それはすばやく簡単です。あなたはおそらく、あなたが答えを得て、ここで推奨されるツールを学ぶ時までにそれを達成することができます。 –

+0

これがLinux/UNIXシステム上にある場合は、sedまたはawkのようなツールを使用して作業のほとんどまたはすべてを行うことができます。 –

答えて

0

先頭、私はタスクのための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 

次のような出力付き10

7 
11 
15 
9 
13 
17 
+0

ありがとうございます。私のパーサーを書き終え、このコードのいくつかを使用しました。 – Fore