2010-05-12 70 views
0

我有一個包含文本像這樣的文本數據文件:C# - 讀入文本文件;解析特定文本

 
"[category.type.group.subgroup]" - "2934:10,4388:20,3949:30" 
"[category.type.group.subgroup]" - "2934:10,4388:20,3949:30" 
"[category.type.group.subgroup]" - "2934:10,4388:20,3949:30" 
"[category.type.group.subgroup]" - "2934:10,4388:20,3949:30" 
34i23042034002340 ----- 
"[category.type.group.subgroup]" - "2934:10,4388:20,3949:30" 
"[category.type.group.subgroup]" - "2934:10,4388:20,3949:30" 
828728382 ------ 3498293485 AAAAAAA 

我需要解析的數據的最佳方式,特別是我需要的類別,類型,組羣,和數值在報價中。我正在考慮使用正則表達式,但我想知道是否有其他的想法,而不是有幾個IF語句來分析數據?

回答

0

嘗試FileHelpers library,它需要一些工作來設置,但爲您節省了大量的工作來處理解析文件時遇到的所有棘手的情況。它可以處理分隔,固定寬度或基於記錄的解析。

+0

非常酷 - 現在檢查了這一點! – Joker 2010-05-12 18:04:40

3

如果使用正則表達式,則不需要多個IF語句。像這樣的東西會用一個正則表達式閱讀幾個值:

Regex parseLine = new Regex(@"(?<num1>\d+)\:(?<num2>\d+)\,(?<num3>\d+)", RegexOptions.Compiled); 
foreach (string line in File.ReadAllLines(yourFilePath)) 
{ 
    var match = parseLine.Match(line); 
    if (match.Success) { 
    var num1 = match.Groups["num1"].Value; 
    var num2 = match.Groups["num2"].Value; 
    var num3 = match.Groups["num3"].Value; 
    // use the values. 
    } 
} 
+0

這不會是一個噩夢維持,因爲你添加了所有肯定會出現的變化的陷阱... – jball 2010-05-12 17:55:02

+0

我明白迄今爲止 - 但數據各不相同。有時我可以在引號之間有10到20套「id:value」,有時候沒有。我需要解析「[和]」(名稱)之間的數據,以及可能跟隨它的任何「id:value」集合(如果它們存在的話)。我創建了一個名稱,ID,值的結構(爲了簡單起見,字符串)。該名稱位於「[和]」之間,id是「:」之前的第一個整數,值是「:」後面的整數。那有意義嗎? – Joker 2010-05-12 17:59:10

0
string reg = "\"\\[([^.]+)\\.([^.]+)\\.([^.]+)\\.([^.]+)\\]\"\\s+-\\s+\"([0-9]+):([0-9]+),([0-9]+):([0-9]+),([0-9]+):([0-9]+)\""; 
Regex r = new Regex(reg); 
Match m = r.Match(aline); 
if (m.Success) 
{ 
    string category = m.Groups[1]; 
    string type = m.Groups[2]; 
    string group = m.Groups[3]; 
    string subgroup = m.Groups[4]; 
    string num1 = m.Groups[5]; 
    // and so on... 
} 

編輯 剛看到,你可以擁有數套任意數量。以下應處理:

 string reg = "\"\\[([^.]+)\\.([^.]+)\\.([^.]+)\\.([^.]+)\\]\"(\\s+-\\s+\"(([0-9]+):([0-9]+),?)+\")?"; 
     string reg2 = "([0-9]+):([0-9]+),?"; 
     Regex r = new Regex(reg); 

     Console.WriteLine(a); 
     Console.WriteLine(reg); 
     Match m = r.Match(a); 
     if (m.Success) 
     { 
      string category = m.Groups[1]; 
      string type = m.Groups[2]; 
      string group = m.Groups[3]; 
      string subgroup = m.Groups[4]; 

      MatchCollection mc = Regex.Matches(m.Groups[5].Value, reg2); 
      List<string> numbers = new List<string>(); 
      foreach (Match match in mc) 
      { 
       numbers.Add(match.Groups[1].Value); 
       numbers.Add(match.Groups[2].Value); 
      } 
     }