C# - 读取文本文件;解析特定文本

时间:2010-05-12 17:43:00

标签: c# string file text parsing

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

"[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语句来分析数据?

3 个答案:

答案 0 :(得分:3)

如果使用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.
  }
}

答案 1 :(得分:0)

尝试使用FileHelpers library,它需要花费一些时间进行设置,但是可以节省大量的工作来处理解析这样的文件时出现的所有棘手情况。它可以处理分隔,固定宽度或基于记录的解析。

答案 2 :(得分: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...
}

EDIT 刚刚看到你可以拥有任意数量的数字集。以下应该处理:

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