在.NET中解析定界CSV

我有一个以逗号分隔的格式的文本文件,"在大多数字段上都用分隔。我试图将其纳入我可以枚举的内容(例如,通用集合)。我无法控制文件的输出方式,也无法控制定界符使用的字符。


在这种情况下,这些字段用逗号分隔,而文本字段则用"标记括起来。我"遇到的问题是某些字段中有引号(即8 托盘),并且不小心将其作为下一个字段。对于数字字段,它们周围没有引号,但它们确实以+或-号开头(表示正数/负数)。


我当时在想RegEx,但是我的技能不是很好,所以希望有人能提出一些我可以尝试的想法。该文件中大约有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,在您击中第3条记录(在文本字段中带有引号)之前,它似乎工作良好。如果我能以某种方式使其处理附加报价,那么CSVReader选项将非常有用。


谢谢!


炎炎设计
浏览 388回答 3
3回答

开满天机

从这里:Encoding fileEncoding = GetFileEncoding(csvFile);// get rid of all doublequotes except those used as field delimitersstring fileContents = File.ReadAllText(csvFile, fileEncoding);string fixedContents = Regex.Replace(fileContents, @"([^\^,\r\n])""([^$,\r\n])", @"$1$2");using (CsvReader csv =       new CsvReader(new StringReader(fixedContents), true)){       // ... parse the CSV

小唯快跑啊

我建议查看.Net 中的TextFieldParserClass。您需要包括Imports Microsoft.VisualBasic.FileIO.TextFieldParser这是一个简单的示例:        Dim afile As FileIO.TextFieldParser = New FileIO.TextFieldParser(FileName)        Dim CurrentRecord As String() ' this array will hold each line of data        afile.TextFieldType = FileIO.FieldType.Delimited        afile.Delimiters = New String() {","}        afile.HasFieldsEnclosedInQuotes = True        ' parse the actual file        Do While Not afile.EndOfData            Try                CurrentRecord = afile.ReadFields            Catch ex As FileIO.MalformedLineException                Stop            End Try        Loop
打开App,查看更多内容
随时随地看视频慕课网APP