C# CSV正则表达式拆分缺少的列
我正在尝试使用以下正则表达式拆分CSV输入:C# CSV正则表达式拆分缺少的列,c#,.net,regex,csv,C#,.net,Regex,Csv,我正在尝试使用以下正则表达式拆分CSV输入: (?:^|,)(?=[^"]|(")?)"?((?(1)[^"]*|[^,"]*))"?(?=,|$) 包含数据、A、b、c的行/行将产生3个匹配项: ,b ,c 我丢失了,一个,我不知道需要更改什么 它似乎可以使用Python选项工作: 知道如何为.NET修复它吗 这可能有助于: (?:^|,)(?=[^"]|(")?)"?((?(1)[^"]*|[^,"]*))"?(?=,|$) 正如其他人所建议的那样,您应该使用一个用于解析CSV字符
(?:^|,)(?=[^"]|(")?)"?((?(1)[^"]*|[^,"]*))"?(?=,|$)
包含数据、A、b、c
的行/行将产生3个匹配项:
,一个,我不知道需要更改什么
它似乎可以使用Python选项工作:
知道如何为.NET修复它吗
这可能有助于:
(?:^|,)(?=[^"]|(")?)"?((?(1)[^"]*|[^,"]*))"?(?=,|$)
正如其他人所建议的那样,您应该使用一个用于解析CSV字符串的类。TextFieldParser
类内置于.NET中。除非您的问题中没有提到其他要求,否则可能不需要使用外部库
using(MemoryStream stream = new MemoryStream())
using(StreamWriter writer = new StreamWriter(stream))
{
writer.Write(s);
writer.Flush();
stream.Position = 0;
using(TextFieldParser parser = new TextFieldParser(stream)){
parser.TextFieldType = FieldType.Delimited;
parser.Delimiters = new string[] {","};
parser.HasFieldsEnclosedInQuotes = true;
while(!parser.EndOfData){ //Loop through lines until we reach the end of the file
string[] fields = parser.ReadFields(); //This will contain your fields
}
}
}
为什么不使用Csv NuGet软件包,该软件包考虑到您现在正试图解决的Csv解析的许多细微差别,以及您还不知道需要解决的其他问题:-)
CsvHelper是一个非常流行的操作系统包:
是的,我知道regex不是“正确”的答案,但这正是问题的目的,我喜欢一个好的regex挑战
注意:尽管下面的解决方案可能适用于其他正则表达式引擎,但按原样使用它将要求您的正则表达式引擎将其视为一个单独的捕获组。(.NET默认情况下会执行此操作)
当CSV文件/流(匹配)的多行/记录传递给下面的正则表达式时,它将为每个非空行/记录返回匹配。每个匹配项将包含一个名为Value
的捕获组,该捕获组包含该行/记录中捕获的值(如果该行/记录末尾有一个开放引号,则可能包含一个OpenValue
捕获组)
下面是注释模式(测试它):
(?在google中查看csv到数据集C#?为什么要使用正则表达式?在这种情况下,这比使用正则表达式更简洁。+1对你来说,简单地读取所有文件,将其存储在字符串数组中,并在“,”处使用字符拆分器是否更简单?TextFieldParser可以读取流、文件或文本读取器,但不能直接从字符串或字符串数组读取,这就是我们“加载”的原因首先将字符串转换为内存流。因为CSV格式的字符串/文件可能有转义项,有些带有引号,有些没有引号,这可能会导致问题。TextFieldParser是一种快速解析CSV字符串的方法,同时确保不会出现这样的差异。太好了,很高兴知道!谢谢回答,谢谢。我将使用CsvHe尽管如此,我还是要看看答案——因为它似乎更强大。再次感谢。对于如此简单的东西,不需要外部库。为什么不使用内置的TextFieldParser
类呢?Csv解析并不总是简单的,有很多细微差别-这就是库存在的原因。TextFieldParser
已经处理了每一个“细微差别”我遇到过。它唯一不处理的是非引号(“)文本限定符,这在本例中不是问题。谢谢-不知道它存在,看起来很棒!