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 “[类别.类型.组.子组]”-“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 AAAAAC#-在文本文件中读取;特定文本的解析,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
我需要解析数据的最佳方式,特别是我需要引号中的类别、类型、组、子组和数值。我曾考虑使用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是“:”前面的第一个整数,值是“:”后面的整数。这有意义吗?