【问题标题】:C# - Reading in text file; parsing for specific textC# - 读取文本文件;解析特定文本
【发布时间】:2010-05-12 17:42:59
【问题描述】:

我有一个文本数据文件,其中包含如下文本:

“[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

我需要解析数据的最佳方式,特别是我需要引号中的类别、类型、组、子组和数值。我正在考虑使用 Regex,但我想知道是否有其他想法而不是使用多个 IF 语句来分析数据?

【问题讨论】:

    标签: c# string file text parsing


    【解决方案1】:

    如果您使用 Regex,则不需要多个 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.
      }
    }
    

    【讨论】:

    • 这不会是一场噩梦,因为您要为所有肯定会出现的变化添加陷阱......
    • 到目前为止我了解 - 但是数据会有所不同。有时我可以在引号之间有 10-20 组“id:value”,有时没有。除了可能跟随它的任何“id:value”集(如果它们存在)之外,我还需要解析“[和]”(名称)之间的数据。我创建了一个带有名称、id、值的结构(为简单起见作为字符串)。名称在“[ 和 ]”之间,id 是 ':' 之前的第一个整数,值是 ':' 之后的整数。这有意义吗?
    【解决方案2】:

    试试FileHelpers library,它需要做一些设置工作,但可以为您节省大量工作来处理在解析这样的文件时出现的所有棘手情况。它可以处理定界、固定宽度或基于记录的解析。

    【讨论】:

      【解决方案3】:
      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);
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多