2

所以这里有很多帖子说明我应该使用 Vb.Net TextFiledParser,而不是滚动我自己的 csv 解析器。

我试过了,但是如果我错了,请告诉我,它会根据单个分隔符进行解析。

因此,如果我有一个地址字段“Flat 1, StackOverflow House, London”,我会得到三个字段。不幸的是,这不是我想要的。我需要给定单元格中的所有内容都保留为数组中的单个项目。

所以我开始编写自己的正则表达式,如下所示:

var testString = @"""Test 1st string""" + "," + @"""Flat 1, StackOverflow House, London, England, The Earth""" + "," + "123456";

var matches = Regex.Matches(chars, @"""([^""\\])*?(?:\\.[^""\\]*)*?""");
var numbers = Regex.Matches(chars, @"\d+$");//only numbers
Assert.That(results.Count(), Is.EqualTo(3));
Assert.That(secondMatch.Count, Is.EqualTo(1));

第一个断言失败,因为没有返回字符串“123456”。该表达式仅返回“Test 1st string”和“Flat 1, StackOverflow House, London, England, The Earth”

我想要的是正则表达式返回所有引用\转义和数字。

我不控制数据,但数字字符串将全部被引用\转义,而数字不会。

我真的很感激一些帮助,因为我绕着圈子尝试第三方库,但没有取得多大成功。

不用说 string.split 在地址的情况下不起作用,而且http://www.filehelpers.com/似乎没有考虑这些例子。

4

2 回答 2

2

只是为了让您了解您所面临的问题:这是一个应该可以很好地工作的正则表达式。但是你肯定需要测试一下它,因为 CSV 有很多极端情况,我肯定会错过一些(而且我假设逗号作为分隔符和"引号字符(通过加倍转义)):

(?:           # Match either
 (?>[^",\n]*) #  0 or more characters except comma, quote or newline
|             # or
 "            #  an opening quote
 (?:          #  followed by either
  (?>[^"]*)   #   0 or more non-quote characters
 |            #  or
  ""          #   an escaped quote ("")
 )*           #  any number of times
 "            #  followed by a closing quote
)             # End of alternation
(?=,|$)       # Assert that the next character is a comma (or end of line)

在 VB.NET 中:

Dim ResultList As StringCollection = New StringCollection()
Dim RegexObj As New Regex(
    "(?:            # Match either" & chr(10) & _
    " (?>[^"",\n]*) #  0 or more characters except comma, quote or newline" & chr(10) & _
    "|              # or" & chr(10) & _
    " ""            #  an opening quote" & chr(10) & _
    " (?:           #  followed by either" & chr(10) & _
    "  (?>[^""]*)   #   0 or more non-quote characters" & chr(10) & _
    " |             #  or" & chr(10) & _
    "  """"         #   an escaped quote ("""")" & chr(10) & _
    " )*            #  any number of times" & chr(10) & _
    " ""            #  followed by a closing quote" & chr(10) & _
    ")              # End of alternation" & chr(10) & _
    "(?=,|$)        # Assert that the next character is a comma (or end of line)", 
    RegexOptions.Multiline Or RegexOptions.IgnorePatternWhitespace)
Dim MatchResult As Match = RegexObj.Match(SubjectString)
While MatchResult.Success
    ResultList.Add(MatchResult.Value)
    MatchResult = MatchResult.NextMatch()
End While
于 2012-05-09T13:27:21.950 回答
0

我用来快速绕过它的一种 hacky 方法是首先Split使用引号,然后在每个其他索引之间,去掉引号(或用某些东西替换它们)。然后再把Split字符串放在逗号上

刚刚发现这个:解析 CSV 数据的 Javascript 代码- 我很欣赏它是 JavaScript 而不是 vb.net。但是,您应该能够关注它

另外,如何使用 Javascript 解析 CSV 字符串,其中包含数据中的逗号?

于 2012-05-09T13:13:32.087 回答