2010-05-12 69 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); 
      } 
     }