2

したがって、ここには、自分のcsvパーサーをロールするのではなく、Vb.NetTextFiledParserのいずれかを使用する必要があることに注意する投稿がたくさんあります。

試しましたが、間違っている場合は、1つの区切り文字に基づいて解析されます。

したがって、アドレスフィールド「Flat1、StackOverflow House、London」がある場合、3つのフィールドが取得されます。残念ながら、それは私が望んでいることではありません。配列内の単一のアイテムとして残るには、特定のセル内のすべてのものが必要です。

だから私は次のように自分の正規表現を書き始めました:

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」が返されないため、最初のアサーションは失敗します。この式は、「Test1ststring」と「Flat1、StackOverflow House、London、England、TheEarth」のみを返します。

私が欲しいのは、正規表現が引用符で囲まれた\エスケープされたすべてのものと数字を返すことです。

私はデータを制御しませんが、図の文字列はすべて引用符で囲まれ、エスケープされ、数値は制御されません。

サードパーティのライブラリを試してみてもあまり成功しなかったので、助けていただければ幸いです。

言うまでもなく、string.splitはアドレスの場合には機能せず、http://www.filehelpers.com/はそのような例を説明していないようです。

4

2 に答える 2

2

あなたが何に反対しているのかをあなたに知らせるために:これは非常にうまくいくはずの正規表現です。しかし、CSVのコーナーケースが非常に多いため、いくつかを見逃していることは間違いないので、間違いなくテストする必要があります(そして、カンマを区切り文字および"引用文字として想定しています(これは2倍にすることでエスケープされます) ))::

(?:           # 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

私がすぐに回避するために使用したハックな方法は、最初Splitに引用符で囲み、次に他のすべてのインデックスの間で引用符を削除する (またはそれらを何かに置き換える) ことでした。次にSplit、コンマの文字列をもう一度

ちょうどこれを見つけました: CSV データを解析するための Javascript コード- vb.net ではなく JavaScript であることを感謝します。ただし、それに従うことができるはずです

また、データにコンマが含まれる CSV 文字列を Javascript で解析するにはどうすればよいですか?

于 2012-05-09T13:13:32.087 に答える