2009-05-29 97 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 2009-05-29 00:53:35

回答

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(); 
     } 
    } 
}