Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于解析CSV的正则表达式_C#_Regex_Csv - Fatal编程技术网

C# 用于解析CSV的正则表达式

C# 用于解析CSV的正则表达式,c#,regex,csv,C#,Regex,Csv,我正在尝试编写一个正则表达式,它将从CSV文件中提取单个字段 例如,如果CSV文件中有以下行: 123, Bob ,Bob, " Foo Bar ", "a, ""b"", c" 应给出以下结果(无单引号): 请注意,除非前导空格和尾随空格在引号内,否则应修剪它们 我不担心无效的CSV行,例如未匹配结束引号的开放引号。根据上述规则,您可以安全地假设CSV文件是完全有效的 如果单个正则表达式比较困难,我也可以使用多个正则表达式。但我喜欢避免使用标准的C#操作,除非它们简单且简短。(我

我正在尝试编写一个正则表达式,它将从CSV文件中提取单个字段

例如,如果CSV文件中有以下行:

123,    Bob    ,Bob, " Foo Bar ", "a, ""b"", c"
应给出以下结果(单引号):

请注意,除非前导空格和尾随空格在引号内,否则应修剪它们

我不担心无效的CSV行,例如未匹配结束引号的开放引号。根据上述规则,您可以安全地假设CSV文件是完全有效的

如果单个正则表达式比较困难,我也可以使用多个正则表达式。但我喜欢避免使用标准的C#操作,除非它们简单且简短。(我不想以编写大量代码而告终。)


那么,有什么建议吗?

我不会尝试编写自己的csv解析器,因为有很多人可以为您完成这项工作


正则表达式可能存在许多错误。。。尝试下面的代码,它为我做的把戏,它是甜蜜和简单的

Using Reader As New Microsoft.VisualBasic.FileIO.TextFieldParser("C:\MyFile.csv")

Reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited

Dim MyDelimeters(0 To 0) As String
Reader.HasFieldsEnclosedInQuotes = False
Reader.SetDelimiters(","c)

Dim currentRow As String()
While Not Reader.EndOfData
    Try
        currentRow = Reader.ReadFields()
        Dim currentField As String
        For Each currentField In currentRow
            MsgBox(currentField)
        Next
    Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
        MsgBox("Line " & ex.Message &
        "is not valid and will be skipped.")
    End Try
End While
End Using
如果方便,则标记为答案…;)

请参见此处的相同内容,,,

您可以使用内置在.NET framework中的类

为了在C#应用程序中使用该类,您需要在以下位置添加Microsoft.VisualBasic.dll的引用(假设您安装了默认设置)

现在,在你的C#类中,使用以下语句:

using Microsoft.VisualBasic.FileIO
我同意regex不是“正确”的答案,但这正是问题的目的,我喜欢一个好的regex挑战

下面的模式是my的一个修改版本,它删除了空格,并假设CSV符合您的要求。您的问题中唯一没有解决的部分是它不会删除转义/双引号。在模式之后给出了取消引用的示例


当CSV文件/流的一个或多个行/记录传递给下面的正则表达式时,它将为每个非空行/记录返回一个匹配项。每个匹配将包含一个名为
Value
的捕获组,该组包含该行/记录中捕获的值


下面是注释模式(测试它):


(?为什么要使用正则表达式?你必须只使用它吗?如果CSV完全有效,你在引用的字段中有换行符。我认为“拆分”方法更适合这种情况。我认为你关于CSV的“通用”概念是错误的。IMO“通用”你正在试图解决一个已经解决的问题——一次又一次——而且更加优雅。你遇到的一些主要问题是你不理解什么是“有效CSV”是,而且有效的CSV数据集可以是多行的。如果有简单的解决方案,我不希望安装第三方库。但我将研究您在第二个链接中提到的内置Microsoft.VisualBasic.FileIO.TextFieldParser。我使用的是C#,似乎找不到Microsoft.VisualBasic.FileIO名称空间e、 有我需要导入的引用吗?C#您应该添加“using System.IO;”这将为您提供读者和作者以及文件访问权限。System.IO没有TextFieldParser类。我正在询问获取该类所需的引用。Yoo man,我遇到了您的问题…更新了我的答案。@Jigar感谢您的帮助。TextFieldParser拥有我所需的一切…除了一件事:如果针对我上面的示例数据使用字段“Foo-Bar”返回'Foo Bar'而不是'Foo Bar'。但是如果我将TrimWhiteSpace设置为false,那么其他字段(如Bob)将不会对其空格进行修剪…有什么想法吗?我将为您在这个庞大的正则表达式中所做的工作量加1!:P@SF李,谢谢!我一直担心这个答案会引起注意,因为我担心它会被忽略own仅仅因为是一个正则表达式而被遗忘。至少现在它可以承受五次这样的投票而不会对声誉造成负面影响。:)
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.VisualBasic.dll
using Microsoft.VisualBasic.FileIO