C#Substring Alternative – 在字符串后面的字符串中返回其余行
我有一些代码读取文本文件并将其设置为字符串。 文本文件的每一行都包含我试图提取的单独数据参数。 这是一个如何布置字符串/文本文件的小例子:
... part=XYZ quantity=123 weight=14 length=60 ...
在给定的行上有“=”之后返回所有内容的好方法吗?
我目前使用子字符串工作,但我很好奇是否有更简洁的方法来获得相同的结果。 这是我目前的代码:
strStart = partData.IndexOf("part=") + 5; strEnd = partData.IndexOf(" ", strStart); string partNum = partData.Substring(strStart, strEnd - strStart);
额外的澄清
我将从文本文件中提取多个变量。 例如,根据上面的数据,我将提取4个变量:
partNum =“XYZ”
qty =“123”
wght =“14”
len =“60”
是的,你可以更简洁地做到这一点。
string partNum = partData.Substring(partData.IndexOf("=") + 1);
这使用了String.Substring的重载版本,它只接受一个参数,即字符串中的起始位置。 它从那一点继续到字符串的结尾。
显然,只有在您partData
中存在等号partData
,但您发布的原始代码也是如此。
你也可以使用正则表达式来做到这一点; 它可以处理比简单的IndexOf
或Split
解决方案更复杂的情况,例如跳过=
周围的空格或不匹配某些模式,或者一次提取单行中找到的所有组件。
string partNum = Regex.Match(partData, @"=(.*)$", RegexOptions.Multiline).Groups[1].Value;
对于简单的情况,正则表达式会更慢(例如只是在=
上拆分),但如果你真的想要从中途复杂模式处理和提取数据,它将更有效,更简洁。
此外,通过检查匹配的Success
属性,您可以validation数据是否符合预期的模式,而无需任何其他处理/validation逻辑。
这是一个示例,它为每个文本行提取=符号之前和之后的部分,该文本行使用字符串中的预期模式,并沿着路径修剪部分:
for (Match match = Regex.Match(partData, @"^s*([^=]+?)s*=s*(.*?)s*$", RegexOptions.Multiline); match.Success; match = match.NextMatch()) { // this code runs for each line in your string which has the expected pattern string key = match.Groups[1].Value; string value = match.Groups[2].Value; }
编辑: 这是一个小提琴 ,它确实显示了此代码如何与您的示例数据一起使用。
假设文本文件采用发布格式且仅包含数据参数,则另一种方法是读取文件内容并将内容投影到字典中,因为您已经知道参数名称,即。 “部分”,“数量”等……
Dictionary param = File .ReadLines("path.to.file.txt") .Select(x => x.Split('=')) .ToDictionary(x => x[0], y => y[1]);
然后可以通过键名访问内容,类似于您最初分配变量的方式:
string partNum = param["part"];
或者,只需根据需要使用字典,而无需分配局部变量。
您可以使用拆分,它可以更容易阅读:
string value = partData.Split('=', 2)[1];
请注意,如果线路上没有“=”,则可以抛出exception。
如果您使用,这将更加强大
var parts = string.Split('=')
谁知道是否有人决定在等号之前或之后放置一个空格? 这会破坏您现有的解决方案,因为它不会找到“part = XXX”。 通过拆分,您可以获得两侧的零件。
上述就是C#学习教程:C#Substring Alternative – 在字符串后面的字符串中返回其余行分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1013786.html