C# 从C中的字符串行获取特定字段或字符#
我有一个文件,逐行读取文件,并从字符串行中提取特定对象 例如,字符串行有两种格式C# 从C中的字符串行获取特定字段或字符#,c#,regex,pattern-matching,C#,Regex,Pattern Matching,我有一个文件,逐行读取文件,并从字符串行中提取特定对象 例如,字符串行有两种格式 VA001748714600006640126132202STRONG 4P 4X44G000099 VA 00174 871460000664 012 6132202 STRONG 4P 4X44G 000099 现在我需要提取字符串并将其存储到我的表和字段中,如下面和上面的两行数据在下面的字段中生成(期望结果) 我已经试过了。我创建了一个返回object[]extract from string的方法 pu
VA001748714600006640126132202STRONG 4P 4X44G000099
VA 00174 871460000664 012 6132202 STRONG 4P 4X44G 000099
现在我需要提取字符串并将其存储到我的表和字段中,如下面和上面的两行数据在下面的字段中生成(期望结果)
我已经试过了。我创建了一个返回object[]
extract from string的方法
public static object[] ProcessLine(string line)
{
var obj = new object[7];
var str = line.Replace("\0", "").Replace(" ", "");
string code = str.Substring(0, 2)?.Trim();
string location = str.Substring(2, 5)?.Trim();
string serialNo = str.Substring(7, 12)?.Trim();
string quantity = str.Substring(19, 3)?.Trim();
int qty = 0;
if (!string.IsNullOrEmpty(quantity))
{
qty = Convert.ToInt32(quantity);
}
string itemNo = str.Substring(22, 7)?.Trim();
Regex MyRegex = new Regex("[^a-z ]", RegexOptions.IgnoreCase);
string description = MyRegex.Replace(line.Substring(2), @"")?.Trim();
string price = str.Substring(str.Length - 6)?.Trim();
obj.SetValue(code, 0);
obj.SetValue(location, 1);
obj.SetValue(serialNo, 2);
obj.SetValue(qty, 3);
obj.SetValue(itemNo, 4);
obj.SetValue(description, 5);
obj.SetValue(price, 6);
return obj;
}
我已经找到子字符串并存储到对象中,也找不到描述,因为该字段不是固定字母
(代码、位置、序列号、数量、项目号和价格)
是固定的字符数,(说明)
字段是任何字符或更改
如何使用
regex
查找此字段的值和说明我试图查找说明,但提取时没有数字 您可以声明一个类似正则表达式的
private static readonly Regex rx = new Regex(@"^(\w{2})\s*(\w{5})\s*(\w{12})\s*(\d{3})\s*(\d{7})\s*(.*?)\s*(\d{6})$", RegexOptions.Compiled);
看
关键是要使用一个匹配整个字符串的正则表达式(^
匹配字符串的开头,$
匹配字符串的结尾),使用\w
(任意字母/数字/\u
字符)或\d
(任意数字字符),{m}
量词,用于匹配与\w
或\d
匹配的一定数量的字符,将描述
字段与*?
匹配,这是一种惰性点模式,与新行以外的任何0+字符匹配,并允许在具有\s*
的字段之间使用任何0+空格字符
那么,你可以使用它
public static object[] ProcessLine(string line)
{
object[] obj = null;
var m = rx.Match(line);
if (m.Success)
{
obj = new object[] {
m.Groups[1].Value,
m.Groups[2].Value,
m.Groups[3].Value,
int.Parse(m.Groups[4].Value).ToString(), // remove leading zeros
m.Groups[5].Value,
m.Groups[6].Value,
m.Groups[7].Value
};
}
return obj;
}
请参阅OP中两个字符串的演示输出:
VA, 00174, 871460000664, 12, 6132202, KING PEPERM E STRONG 4P 4X44G, 000099
VA, 00174, 871460000664, 12, 6132202, KING PEPERM E STRONG 4P 4X44G, 000099
如果确实要使用正则表达式,请参阅 但是,这个问题不需要正则表达式 由于除描述外的所有字段都具有已知长度,因此可以计算描述字段的长度。根据您的规格,描述从位置29开始,然后是价格字段的6个位置。因此,应提供以下说明:
string description = str.Substring(29, str.Length-29-6);
为什么
Description
是STRONG 4P 4X44G0
并且在单词中包含spce在子字符串中是否有任何逻辑?
?您可以像使用正则表达式一样使用。@DragandDrop由于键入错误,我刚刚编辑,是的数量是3个字符,因此如果您将13替换为12,Wiktor正则表达式可以工作。您只需访问group@DragandDrop是的,我在编辑后看到了。我更新了答案以反映这一变化。你能帮我处理上面的正则表达式吗?它工作正常。但在发生变化后,分手后需要regex提供支持VA000205000125453570246121648Sprite REFRESH 33CL 0000600190618142214和VA00020500012545357024621648Sprite REFRESH 33CL 000060意味着如何在正则表达式中选择最后14个字符(\w{2})\s*(\w{5})\s*(\w{13})\s*(\d{3})\s*(\d{7})\s*(*s*)(*d{6}\d})$
这里是最后14位数字optional@LaljiDhameliya很好,你没有发布一个单独的问题,这将是一个重复。看见
string description = str.Substring(29, str.Length-29-6);