正则表达式分割线(csv文件)

我在正则表达式方面不擅长。 有人可以帮我写出正则表达式吗?

在阅读csv文件时,我可能有这样的值。

 “艺术家,名”,专辑,12-SCS
 “VAL” “U,E1”,值2,值3

输出:

艺术家,名称  
专辑
 12-SCS
 VAL“U,E1 
值2 
值3

更新:我喜欢使用Oledb提供商的想法。 我们在网页上有文件上传控制,我使用流阅读器读取文件的内容,而文件系统上没有实际的保存文件。 有没有办法我可以使用Oledb提供程序,因为我们需要在连接字符串中指定文件名,在我的情况下,我没有在文件系统上保存文件。

实际上,它很容易匹配CVS线与正则表达式。 试试这个:

 StringCollection resultList = new StringCollection(); try { Regex pattern = new Regex(@" # Parse CVS line. Capture next value in named group: 'val' \s* # Ignore leading whitespace. (?: # Group of value alternatives. "" # Either a double quoted string, (? # Capture contents between quotes. [^""]*(""""[^""]*)* # Zero or more non-quotes, allowing ) # doubled "" quotes within string. ""\s* # Ignore whitespace following quote. | (?[^,]*) # Or... zero or more non-commas. ) # End value alternatives group. (?:,|$) # Match end is comma or EOS", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace); Match matchResult = pattern.Match(subjectString); while (matchResult.Success) { resultList.Add(matchResult.Groups["val"].Value); matchResult = matchResult.NextMatch(); } } catch (ArgumentException ex) { // Syntax error in the regular expression } 

免责声明:正则表达式已在RegexBuddy (生成此代码段)中进行了测试,并且它正确匹配OP测试数据,但C#代码逻辑未经测试。 (我无法访问C#工具。)

正则表达式不适合这个。 使用CSV 解析器 。 无论是内置的还是第三方的 。

给TextFieldParser类看一下。 它位于Microsoft.VisualBasic程序集中,并进行分隔和固定宽度解析。

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

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

 var streamReader = // Create a StreamReader to your CSV file var csvReader = new CsvReader( streamReader ); var myObjects = csvReader.GetRecords(); 

正则表达式在这里可能过于复杂。 在逗号上拆分行,然后迭代结果位并将它们连接在“连接字符串中的双引号数”不均匀的位置。

“你好,这个”,是“一个”“测试”“”

…分裂…

“你好|这个”| 是| “一个测试”””

…迭代并合并’直到你有偶数双引号…

“你好,这个” – 偶数引号(注意通过在位之间插入的拆分删除逗号)

是 – 偶数引号

“a”“test”“” – 偶数引号

…然后剥离前导和尾随引用(如果存在)并将“”替换为“”。

可以使用以下代码完成:

 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();