2009-05-29 21 views
0

ファイルを解析する必要がありますが、データの解析に奇妙な形式のデータがあります。奇妙な形式のファイルの解析

データは常にこのようにフォーマットされます。フィールド名は左側にあり、データは "="の右側にあり、すべてのフィールドは常にこの順になります。

ファイルデータ:

Report 1 of 1 
job_name = JOBNAME 
job_no = JOB99999 job_id = 6750 
rprt_id = 27811 
rprt_name = SOMEDATA.SOMEUSER.JOBNAME.JOB099999.0000000.? 
ftp_size = 999999 
job_group_name = 1 
clas = Z 
form = 9999 
user_id = SOMEUSER 

私の最初の本能は

 'New up a class created to hold the data' 
     Dim NFOData As New NFOData 
     'Create counter for line numbers' 
     Dim i As Integer = 1 

     Using sr As New StreamReader(filename) 
      While Not sr.EndOfStream 
       Dim line As String = sr.ReadLine 

       Select Case i 
        Case 2 
         NFOData.JobName = line.Substring(11) 
        Case 3 
         NFOData.JobNo = line.Substring(9) 
        Case 4 
         'snipped to save space' 
       End Select 

       i += 1 
      End While 
     End Using 

これは私にとって非常にきれいか優雅ないないようです...このような何かを行うことです。

このようなファイルの解析には、より洗練された方法がありますか?

+0

私にとっては、データが左ではなく右にあるように見えます。 – RedFilter

+0

あなたの権利私はそれを編集します...長い日...ありがとう –

+0

そこに複数のレコードがある場合、ファイルはどのように見えますか? – lothar

答えて

1

次のコードは、C#であるべきであるが、 VBに簡単に変換できます。辞書を使用してファイルのキーをPropertyInfoにマップし、リフレクションを使用して値を設定します。最初の行の処理が行方不明で、多少のマイナーな問題があるかもしれません。

Dictionary<String, PropertyInfo> map = new Dictionary<String, PropertyInfo>(); 

map["job_name"] = typeof(NFOData).GetProperty("JobName"); 
map["job_no"] = typeof(NFOData).GetProperty("JobNo"); 
// .... 

NFOData nfoData = new NfOData(); 

using (StreamReader sr = new StreamReader(filename)) 
{ 
    String line; 

    while ((line = sr.ReadLine()) != null) 
    { 
     String[] parts = line.Split(new[] {" = "}, StringSplitOptions.None); 

     map[parts[0]].SetValue(nfoData, parts[1], null); 
    } 
} 
0

私はおそらく各行を読んで、=で分割し、フィールド名がキーである文字列ハッシュに入れて、フィールド名で参照できるようにします。

0

これは、C#で(申し訳ありませんが、私はVBを持っていない)と、いかなる種類のエラーチェックを持っていませんが、どのようにKeyValuePairsのリストのようなものについて...

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 

namespace NVP 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var nvp = new List<KeyValuePair<string, string>>(); 
      var fs = File.Open(@"c:\temp\report.txt", FileMode.Open); 

      var sw = new StreamReader(fs); 

      while (!sw.EndOfStream) 
      { 
       var line = sw.ReadLine(); 
       if (!String.IsNullOrEmpty(line) && line.Contains("=")) 
       { 
        var tmp = line.Split('='); 
        nvp.Add(new KeyValuePair<string, string>(tmp[0], tmp[1])); 
       } 
      } 

      sw.Close(); 
      fs.Close(); 

      var str = nvp.Select(kv => kv.Key + " " + kv.Value); 
      str.ToList().ForEach(Console.WriteLine); 

      Console.ReadLine(); 
     } 
    } 
}