C# 正则表达式拆分行(csv文件)

C# 正则表达式拆分行(csv文件),c#,.net,regex,csv,C#,.net,Regex,Csv,我的正则表达式不好。有人能帮我写正则表达式吗 我在读取csv文件时可能会有这样的值 "Artist,Name",Album,12-SCS "val""u,e1",value2,value3 “艺术家,姓名”,专辑,12-SCS “val”“u,e1”,值2,值3 输出: Artist,Name Album 12-SCS Val"u,e1 Value2 Value3 艺术家,姓名 专辑 12-SCS 瓦尔“u,e1 价值2 价值3 更新: 我喜欢使用Oledb provider的想法。我们

我的正则表达式不好。有人能帮我写正则表达式吗

我在读取csv文件时可能会有这样的值

"Artist,Name",Album,12-SCS "val""u,e1",value2,value3 “艺术家,姓名”,专辑,12-SCS “val”“u,e1”,值2,值3 输出:

Artist,Name Album 12-SCS Val"u,e1 Value2 Value3 艺术家,姓名 专辑 12-SCS 瓦尔“u,e1 价值2 价值3 更新:
我喜欢使用Oledb provider的想法。我们在网页上有文件上载控制,我使用流读取器读取文件内容,而不在文件系统上实际保存文件。有没有办法使用Oledb provider,因为我们需要在连接字符串中指定文件名,而在我的情况下,我没有在文件系统上保存文件。

正则表达式在这里可能会变得过于复杂。在逗号上拆分行,然后迭代结果位,并在“连接字符串中双引号的数量”不为偶数的地方连接它们

你好,这是一个“测试”

……分开

你好,这是一个“测试”

…迭代并合并,直到有偶数个双引号

“hello,this”-偶数引号(注意,通过在位之间插入拆分删除逗号)

是-偶数引号

“测试”-偶数引号


…然后去掉前导引号和尾随引号(如果存在),并将“”替换为“

正则表达式不适用于此。使用CSV解析器。一个或一个。

让全班同学看看。它位于Microsoft.VisualBasic程序集中,并进行分隔和固定宽度解析。

尝试一下(我维护的库)。它可以通过NuGet获得

您可以轻松地将CSV文件读入自定义类集合。它也很快

var streamReader = // Create a StreamReader to your CSV file
var csvReader = new CsvReader( streamReader );
var myObjects = csvReader.GetRecords<MyObject>();
var streamReader=//为CSV文件创建streamReader
var csvReader=新csvReader(streamReader);
var myObjects=csvReader.GetRecords();

实际上,将CVS行与正则表达式匹配非常容易。试试这个:

StringCollection结果列表=新建StringCollection();
试一试{
正则表达式模式=新正则表达式(@“
#解析CVS行。捕获命名组中的下一个值:“val”
\忽略前导空格。
(?:#一组价值选择。
“”或双引号字符串,
(?#捕获引号之间的内容。
[^”“]*(“”[^”“]*)*#零个或多个非引号,允许
)#字符串中的双引号。
“”\s*#忽略引号后的空格。
|(?[^,]*)#或…零个或多个非逗号。
)#最终价值备选方案组。
(?:,|$)#匹配端为逗号或EOS“,
RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
Match matchResult=pattern.Match(subjectString);
while(matchResult.Success){
结果列表.Add(matchResult.Groups[“val”].Value);
matchResult=matchResult.NextMatch();
} 
}捕获(参数异常){
//正则表达式中的语法错误
}

免责声明:正则表达式已在(生成此代码段的)中进行了测试,它与OP测试数据正确匹配,但C代码逻辑未经测试。(我没有访问C#tools的权限。)

只是添加了我今天早上处理的解决方案

var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)");

foreach (Match m in regex.Matches("<-- input line -->"))
{
    var s = m.Value; 
}

可以使用以下代码完成此操作:

using Microsoft.VisualBasic.FileIO;
string csv = "1,2,3,"4,3","a,"b",c",end";
TextFieldParser parser = new TextFieldParser(new StringReader(csv));
//To read from file
//TextFieldParser parser = new TextFieldParser("csvfile.csv");
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
string[] fields =null;
while (!parser.EndOfData)
{
    fields = parser.ReadFields();
}
parser.Close();

这对于正则表达式来说会很棘手,你考虑过用有限状态机来解析吗?同意,正则表达式是错误的工具。我在Codeproject上使用了您链接的CsvReader,发现它非常适合处理csv文件。我喜欢使用Oledb提供程序的想法。我们在网页上有文件上传控制,我使用流阅读器读取文件内容,而不在文件系统上实际保存文件。是否有任何方法可以使用Oledb provider,因为我们需要在连接字符串中指定文件名,而在我的情况下,我没有将文件保存在文件系统中。这是一个新问题。试着问一个标题、上下文和标记正确的新问题。内置的问题会迫使你将值转换为.NET类型。如果它猜错了一列,它将丢失数据。第三方有很多bug<第三方代码中的code>CsvReader类有2500行长,并且有很多写得很差的函数,因此调试也是一件苦差事。玩得开心+1但是,为什么不在OSS主机(比如github,谷歌代码)上发布那个漂亮的正则表达式库呢。没有CodeProject帐户,我无法下载源代码。TextFieldParser为+1。它是.NET中隐藏的宝石之一——可能是因为某种原因它隐藏在VisualBasic命名空间中。(注:总是听从Brian S.的建议。那些人真的很聪明!)@viggity-很乐意帮忙。您可能还想看一个更复杂的ReX解决方案来解析CSV线-很遗憾,ReGEX与一个单引号的字段不匹配,比如“代码>字段1”、“”“字段2/代码>。
using Microsoft.VisualBasic.FileIO;
string csv = "1,2,3,"4,3","a,"b",c",end";
TextFieldParser parser = new TextFieldParser(new StringReader(csv));
//To read from file
//TextFieldParser parser = new TextFieldParser("csvfile.csv");
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
string[] fields =null;
while (!parser.EndOfData)
{
    fields = parser.ReadFields();
}
parser.Close();