在.NET中解析分隔符CSV

25

我有一个文本文件,格式是逗号分隔的,大多数字段使用"作为定界符。 我想将其转换为可以枚举的形式(例如泛型集合)。 我无法控制文件输出的方式或用于分隔符的字符。

在这种情况下,字段由逗号分隔,文本字段用"括起来。 我遇到的问题是有些字段中有引号(例如8" Tray),并且被错误地认为是下一个字段。 对于数字字段,它们没有引号,但以+或-符号开头(表示正/负数)。

我考虑使用正则表达式,但我的技能不太好,希望有人能提出一些我可以尝试的想法。 这个文件中有大约19,000条记录,所以我尽可能高效地处理它。以下是几个示例数据行:

"00","000000112260   ","Pie Pumpkin                             ","RET","6.99 ","     ","ea ",+0000000006.99000
"00","000000304078   ","Pie Apple caramel                       ","RET","9.99 ","     ","ea ",+0000000009.99000
"00","StringValue here","8" Tray of Food                             ","RET","6.99 ","     ","ea ",-00000000005.3200

虽然字段还有很多,但你可以了解清楚...

我正在使用VB.NET,并且已经设置了一个泛型列表来接受数据。我尝试使用CSVReader,它似乎工作得很好,直到遇到第三个记录(其中包含一个引用的文本字段)。如果我能以某种方式处理额外的引号,那么CSVReader选项将非常有效。

谢谢!


2
最好有格式正确的CSV文件作为起点。 - FlySwat
3
在引号内的双引号应该加倍转义。因此,“8” Tray of Food”在格式中是不被允许的。这样,“hi”,“there”这样的字符串才能存在。当它被转义并加上引号后,变成了“hi”,“”,“there”。如果没有加倍转义,它就变成了“hi”,“there”,看起来像两个字符串。 - user66363
我同意上面两个评论,但不幸的是,我无法控制文件的导出方式。这就是软件导出文件的方式。 - hacker
2
请不要自己编写CSV解析器,也不要使用正则表达式。请使用免费、开源、经过实战检验的FileHelpers库。http://www.filehelpers.com - Judah Gabriel Himango
FileHelpers源代码已不再可用 :( - ajeh
11个回答

0
这种自定义方法的逻辑是:逐行读取文件1,将每行按逗号分割,删除第一个和最后一个字符(删除外部引号但不影响内部引号),然后将数据添加到您的通用列表中。它很短,非常易于阅读和处理。
        Dim fr As StreamReader = Nothing
        Dim FileString As String = ""
        Dim LineItemsArr() as String

        Dim FilePath As String = HttpContext.Current.Request.MapPath("YourFile.csv")

        fr = New System.IO.StreamReader(FilePath)

        While fr.Peek <> -1
            FileString = fr.ReadLine.Trim

            If String.IsNullOrEmpty(FileString) Then Continue While 'Empty Line

            LineItemsArr = FileString.Split(",")

            For Each Item as String In LineItemsArr
                'If every item will have a beginning and closing " (quote) then you can just
                'cut the first and last characters of the string here.
                'i.e.  UpdatedItems = Item. remove first and last character

                'Then stick the data into your Generic List (Of String()?)
            Next
        End While

在去除外部引号之前,可以将其用作字符串处理或数字处理(如果需要)。 - Dillie-O
这不能处理分隔符字符在数据中的情况。 - Chad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接