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

C#-在文本文件中读取;特定文本的解析,c#,string,file,text,parsing,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,43

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

"[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 “[类别.类型.组.子组]”-“2934:104388:203949:30” “[类别.类型.组.子组]”-“2934:104388:203949:30” “[类别.类型.组.子组]”-“2934:104388:203949:30” “[类别.类型.组.子组]”-“2934:104388:203949:30” 34i23042034002340----- “[类别.类型.组.子组]”-“2934:104388:203949:30” “[类别.类型.组.子组]”-“2934:104388:203949:30” 828728382------3498293485 AAAAA
我需要解析数据的最佳方式,特别是我需要引号中的类别、类型、组、子组和数值。我曾考虑使用Regex,但我想知道是否还有其他想法,而不是使用几个if语句来分析数据?

试试,设置起来需要一点工作,但在处理解析这样的文件时出现的所有棘手情况时,您可以省下很多工作。它可以处理分隔、固定宽度或基于记录的解析。

试试,设置起来需要一点工作,但在处理解析这样的文件时遇到的所有棘手情况时,可以节省大量工作。它可以处理分隔、固定宽度或基于记录的解析。

如果使用正则表达式,则不需要几个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.
  }
}
Regex parseLine=newregex(@“(?\d+)\:(?\d+),(?\d+),RegexOptions.Compiled);
foreach(File.ReadAllLines(您的文件路径)中的字符串行)
{
var match=parseLine.match(line);
如果(匹配成功){
var num1=匹配组[“num1”]值;
var num2=match.Groups[“num2”].Value;
var num3=匹配组[“num3”]值;
//使用这些值。
}
}

如果使用正则表达式,则不需要几个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.
  }
}
Regex parseLine=newregex(@“(?\d+)\:(?\d+),(?\d+),RegexOptions.Compiled);
foreach(File.ReadAllLines(您的文件路径)中的字符串行)
{
var match=parseLine.match(line);
如果(匹配成功){
var num1=匹配组[“num1”]值;
var num2=match.Groups[“num2”].Value;
var num3=匹配组[“num3”]值;
//使用这些值。
}
}
编辑 刚才看到你可以有任意数量的数字集。应处理以下问题:

        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);
            }
        }
string reg=“\”\\[([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\]\.(\\s+-\\s+\”(([0-9]+):([0-9]+),?)+\”;
字符串reg2=“([0-9]+):([0-9]+),?”;
正则表达式r=新正则表达式(reg);
控制台写入线(a);
控制台写入线(reg);
匹配m=r.匹配(a);
如果(m.成功)
{
字符串类别=m.Groups[1];
字符串类型=m.Groups[2];
字符串组=m.Groups[3];
string subgroup=m.Groups[4];
MatchCollection mc=Regex.Matches(m.Groups[5]。值,reg2);
列表编号=新列表();
foreach(在mc中匹配)
{
number.Add(match.Groups[1].Value);
number.Add(match.Groups[2].Value);
}
}
编辑 刚才看到你可以有任意数量的数字集。应处理以下问题:

        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);
            }
        }
string reg=“\”\\[([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\]\.(\\s+-\\s+\”(([0-9]+):([0-9]+),?)+\”;
字符串reg2=“([0-9]+):([0-9]+),?”;
正则表达式r=新正则表达式(reg);
控制台写入线(a);
控制台写入线(reg);
匹配m=r.匹配(a);
如果(m.成功)
{
字符串类别=m.Groups[1];
字符串类型=m.Groups[2];
字符串组=m.Groups[3];
string subgroup=m.Groups[4];
MatchCollection mc=Regex.Matches(m.Groups[5]。值,reg2);
列表编号=新列表();
foreach(在mc中匹配)
{
number.Add(match.Groups[1].Value);
number.Add(match.Groups[2].Value);
}
}

这不会是一场噩梦,因为您可以为所有肯定会出现的变化添加gotchas…我了解到目前为止-但是数据会有所不同。有时我可能在引号之间有10-20组“id:value”,有时没有。我需要解析“[和]”(名称)之间的数据,以及后面可能出现的任何“id:value”集(如果存在的话)。我创建了一个包含名称、id和值的结构(为简单起见,使用字符串)。名称在“[和]”之间,id是“:”前面的第一个整数,值是“:”后面的整数。这有意义吗?这不会是一场噩梦,因为你要为所有肯定会出现的变化添加gotchas…我理解到目前为止-但是数据不同。有时我可能在引号之间有10-20组“id:value”,有时没有。我需要解析“[和]”(名称)之间的数据,以及后面可能出现的任何“id:value”集(如果存在的话)。我创建了一个包含名称、id和值的结构(为简单起见,使用字符串)。名称在“[和]”之间,id是“:”前面的第一个整数,值是“:”后面的整数。这有意义吗?