C# 如何获取在搜索的术语后出现的逗号分隔值?
以下是我目前的代码:C# 如何获取在搜索的术语后出现的逗号分隔值?,c#,regex,parsing,csv,C#,Regex,Parsing,Csv,以下是我目前的代码: public void DeserialStream(string filePath) { using (StreamReader sr = new StreamReader(filePath)) { string currentline; while ((currentline = sr.ReadLine()) != null) {
public void DeserialStream(string filePath)
{
using (StreamReader sr = new StreamReader(filePath))
{
string currentline;
while ((currentline = sr.ReadLine()) != null)
{
if (currentline.IndexOf("Count", StringComparison.CurrentCultureIgnoreCase) >= 0)
{
Console.WriteLine(currentline);
}
}
}
}
我想知道如何获取在我搜索的词之后出现的逗号分隔值
例如,如果我使用包含以下信息的csv:
"Date","dd/mm/yyyy"
"ExpirationDate","dd/mm/yyyy"
"DataType","Count"
"Location","Unknown","Variable1","Variable2","Variable3"
"A(Loc3, Loc4)","Unknown","5656","787","42"
"A(Loc5, Loc6)","Unknown","25","878","921"
"DataType","Net"
"Location","Unknown","Variable1","Variable2","Variable3"
"A(Loc3, Loc4)","Unknown","5656","787","42"
"A(Loc5, Loc6)","Unknown","25","878","921"
但是,我如何在计数之后但在净额之前获取值表呢
也就是说,只有括号中的数据是我想要解析的:
"Date","dd/mm/yyyy"
"ExpirationDate","dd/mm/yyyy"
"DataType","Count"
[ "Location","Unknown","Variable1","Variable2","Variable3"
"A(Loc3, Loc4)","Unknown","5656","787","42"
"A(Loc5, Loc6)","Unknown","25","878","921"]
"DataType","Net"
"Location","Unknown","Variable1","Variable2","Variable3"
"A(Loc3, Loc4)","Unknown","5656","787","42"
"A(Loc5, Loc6)","Unknown","25","878","921"
我在想也许我应该使用正则表达式,或者有没有更简单的方法来使用上面的方法 您可以像这样使用正则表达式:
\"DataType\"\,\"(?:Count|Net)\"((?!\"DataType\").)*
这将使数据类型行始终与下一个数据类型行相匹配。您可以使用如下正则表达式:
\"DataType\"\,\"(?:Count|Net)\"((?!\"DataType\").)*
这将使数据类型行始终与下一个数据类型行相匹配。您可以使用如下正则表达式:
\"DataType\"\,\"(?:Count|Net)\"((?!\"DataType\").)*
这将使数据类型行始终与下一个数据类型行相匹配。您可以使用如下正则表达式:
\"DataType\"\,\"(?:Count|Net)\"((?!\"DataType\").)*
这将使数据类型行始终与下一个数据类型行相匹配。您可以使用LINQ:
List<string> lines = File.ReadLines(path)
.SkipWhile(l => l.IndexOf("\"Count\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.Skip(1) // skip the "Count"-line
.TakeWhile(l => l.IndexOf("\"Net\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.ToList();
(感谢)
现在,您可以在上面的查询中使用SelectMany
,以平展所有令牌:
List<string> allTokens = File.ReadLines(path)
.SkipWhile(l => l.IndexOf("\"Count\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.Skip(1) // skip the "Count"-line
.TakeWhile(l => l.IndexOf("\"Net\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.SelectMany(l => SplitCSV(l.Trim()))
.ToList();
您可以使用LINQ:
List<string> lines = File.ReadLines(path)
.SkipWhile(l => l.IndexOf("\"Count\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.Skip(1) // skip the "Count"-line
.TakeWhile(l => l.IndexOf("\"Net\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.ToList();
(感谢)
现在,您可以在上面的查询中使用SelectMany
,以平展所有令牌:
List<string> allTokens = File.ReadLines(path)
.SkipWhile(l => l.IndexOf("\"Count\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.Skip(1) // skip the "Count"-line
.TakeWhile(l => l.IndexOf("\"Net\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.SelectMany(l => SplitCSV(l.Trim()))
.ToList();
您可以使用LINQ:
List<string> lines = File.ReadLines(path)
.SkipWhile(l => l.IndexOf("\"Count\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.Skip(1) // skip the "Count"-line
.TakeWhile(l => l.IndexOf("\"Net\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.ToList();
(感谢)
现在,您可以在上面的查询中使用SelectMany
,以平展所有令牌:
List<string> allTokens = File.ReadLines(path)
.SkipWhile(l => l.IndexOf("\"Count\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.Skip(1) // skip the "Count"-line
.TakeWhile(l => l.IndexOf("\"Net\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.SelectMany(l => SplitCSV(l.Trim()))
.ToList();
您可以使用LINQ:
List<string> lines = File.ReadLines(path)
.SkipWhile(l => l.IndexOf("\"Count\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.Skip(1) // skip the "Count"-line
.TakeWhile(l => l.IndexOf("\"Net\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.ToList();
(感谢)
现在,您可以在上面的查询中使用SelectMany
,以平展所有令牌:
List<string> allTokens = File.ReadLines(path)
.SkipWhile(l => l.IndexOf("\"Count\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.Skip(1) // skip the "Count"-line
.TakeWhile(l => l.IndexOf("\"Net\"", StringComparison.InvariantCultureIgnoreCase) == -1)
.SelectMany(l => SplitCSV(l.Trim()))
.ToList();
您需要提供有关如何格式化CSV的更多信息。如果你想使用正则表达式,你需要提供正则表达式必须找到的所有可能的模式。现在,您希望如何捕获逗号分隔列表中的值?从
Split()
生成的简单字符串[]会起作用吗?我如何自定义Split(),以便只捕获计数后出现的文本,但在另一个类似文本字段之前,在上面的示例DateType,Net之前?您需要提供有关如何格式化CSV的更多信息。如果你想使用正则表达式,你需要提供正则表达式必须找到的所有可能的模式。现在,您希望如何捕获逗号分隔列表中的值?从Split()
生成的简单字符串[]会起作用吗?我如何自定义Split(),以便只捕获计数后出现的文本,但在另一个类似文本字段之前,在上面的示例DateType,Net之前?您需要提供有关如何格式化CSV的更多信息。如果你想使用正则表达式,你需要提供正则表达式必须找到的所有可能的模式。现在,您希望如何捕获逗号分隔列表中的值?从Split()
生成的简单字符串[]会起作用吗?我如何自定义Split(),以便只捕获计数后出现的文本,但在另一个类似文本字段之前,在上面的示例DateType,Net之前?您需要提供有关如何格式化CSV的更多信息。如果你想使用正则表达式,你需要提供正则表达式必须找到的所有可能的模式。现在,您希望如何捕获逗号分隔列表中的值?从Split()
生成的简单字符串[]会起作用吗?我如何自定义Split(),以便只捕获计数后出现的文本,但在另一个类似的文本字段之前,在上面的DateType,Net之前的示例中?这会起作用,问题是我有一个包含多个数据类型的csv文件。。。。数据类型A、B、C、D、E等,。。。。我只需要从数据类型C到D的信息。在上面的例子中,我想指定正则表达式包含Count和Net,因为它们是唯一唯一的标识符。顺便说一句,如果我有上面相同的CSV格式,但有21X23的数据网格,正则表达式会改变吗?正则表达式最重要的是文本的格式。只要正则表达式匹配的模式没有改变,网格是否改变也没关系。如果是的话,我建议你创建一个新问题。顺便说一句,我有一个小问题,如果我想使用上面的正则表达式,我会这样写:var countRegex=newregex(“\”数据类型\“,\”(?:Count | Net)\”((?!\”数据类型\“)*”;然而,在我的Visual Studio中,它告诉我逗号是无法识别的转义序列?如何解决这个问题?请尝试在字符串前面加一个@:var countRegex=new Regex(@“\”DataType\”,\“(?:Count | Net)\”(((?!\”DataType\)*”)代码>那会有用的,问题是我有一个包含多个数据类型的csv文件。。。。数据类型A、B、C、D、E等,。。。。我只需要从数据类型C到D的信息。在上面的例子中,我想指定正则表达式包含Count和Net,因为它们是唯一唯一的标识符。顺便说一句,如果我有上面相同的CSV格式,但有21X23的数据网格,正则表达式会改变吗?正则表达式最重要的是文本的格式。只要正则表达式匹配的模式没有改变,网格是否改变也没关系。如果是的话,我建议你创建一个新问题。顺便说一句,我有一个小问题,如果我想使用上面的正则表达式,我会这样写:var countRegex=newregex(“\”数据类型\“,\”(?:Count | Net)\”((?!\”数据类型\“)*”;然而,在我的Visual Studio中,它告诉我逗号是无法识别的转义序列?如何解决这个问题?请尝试在字符串前面加一个@:var countRegex=new Regex(@“\”DataType\”,\“(?:Count | Net)\”(((?!\”DataType\)*”)代码>那会有用的,问题是我有一个包含多个数据类型的csv文件。。。。数据类型A、B、C、D、E等,。。。。我只需要从数据类型C到D的信息。在上面的例子中,我想指定正则表达式包含Count和Net,因为它们是唯一唯一的标识符。顺便说一句,我还有一个问题,如果我有上面相同的CSV格式,但是有21X23的数据网格,正则表达式会改变吗?正则表达式的重要之处是f