2016-07-13 9 views
2

複数の質問と回答を含むセルがあり、CSVのように編成されています。だから、これらの質問と回答をすべて得るには、カンマを使って簡単に分割して区切り記号で区切ってください。スプリット、特定の分割をエスケープする

残念ながら、コンマを小数点の区切り記号として使用するいくつかの値があります。それらの出来事のために分割をエスケープする方法はありますか?

私のデータは区切り記号として "、"を使用して分割できますが、そうでない場合は手動で小数点区切り文字をカンマからドットに置き換える以外にも解決策がありますか?

例:

"価格:0.09、数量:12、販売:はい" を分割使用( "価格:0.09、数量:12は、販売:はい"、 "")だろう収率:

価格:0
数量:12
販売:はい

+1

このような厳密な問題は、「<>」やそのようなもののような「自然発生」はほとんど起こりそうにないデリミタを使用するのが好きな理由です。意図しない区切り文字をエスケープするという意味では、区切り文字を他のものに変更するためにreplaceを使う必要があり、どちらを置き換えるべきかを検出するために賢明な文字列ロジックを使用する必要があると思います。 – RGA

+1

もっとも望ましいオプションです。しかし残念ながら、区切り文字を決めることは必ずしもできないため、第三者があなたに与えるものに対処しなければなりません。 – Luuklag

+0

デリミタではないカンマは、それ自体で区切られていますか?トム、ボブ、ハリーはそれぞれ$ 1、どれくらいの$がありますか? "、" $ 9 "'? –

答えて

0

一つの可能​​性は、この試験データが与えられると、分割後の配列をループしており、中に何:がありませんたびに文字列、このエントリを前のエントリに追加します。

これは次のようになりますし機能:例えば、セパレーターcaharacters :とパラメータに,を行うことにより、改善の余地があることを

Public Function CleanUpSeparator(celldata As String) As String() 
    Dim ret() As String 
    Dim tmp() As String 
    Dim i As Integer, j As Integer 

    tmp = Split(celldata, ",") 
    For i = 0 To UBound(tmp) 
     If InStr(1, tmp(i), ":") < 1 Then 
      ' Put this value on the previous line, and restore the comma 
      tmp(i - 1) = tmp(i - 1) & "," & tmp(i) 
      tmp(i) = "" 
     End If 
    Next i 

    j = 0 
    ReDim ret(j) 
    For i = 0 To UBound(tmp) 
     If tmp(i) <> "" Then 
      ret(j) = tmp(i) 
      j = j + 1 
      ReDim Preserve ret(j) 
     End If 
    Next i 

    ReDim Preserve ret(j - 1) 

    CleanUpSeparator = ret 
End Function 

注意。

+0

これは本当にすてきな解決策です。私は何がもっと短くなるだろうかと思いますか? – Luuklag

+0

あなたは2番目の反復をスキップし、これを呼び出す関数で空の値を処理することができます。私はソースからそのようなものをきれいにすることを好む。それ以外に、VBは配列エントリを削除するための大きなサポートを持っていません。 – steenbergh

+0

私はあなたのコードを具体的に意味するものではなく、かなり効率的かつきれいに書かれています。一般的な問題だけのために、より短い解決策が存在しますか? – Luuklag

関連する問題