カンマ区切りのCSVファイルの場合、文字列をダブルクォーテーションで囲んである場合があります。
VB.netにはCSVファイルを解読する機能がないようです。
スポンサーリンク
こんな感じのファイルがあると困ります。
"abc,de","fghij","klmno"
列の項目ごとに分けて配列に格納する時に、カンマで分けると、abcとdeが分かれてしまいます。
こういう場合は、「","」を一旦、「*<>*」といった、ファイルに含まれないような文字列に置換してから、「,」を削除し、「*<>*」→「","」とすることで回避できます。
-「","」→「*<>*」
"abc,de*<>*fghij*<>*klmno"-「,」→「」
"abcde*<>*fghij*<>*klmno"-「*<>*」→「","」
"abcde","fghij","klmno"
"abc,de*<>*fghij*<>*klmno"-「,」→「」
"abcde*<>*fghij*<>*klmno"-「*<>*」→「","」
"abcde","fghij","klmno"
列が全て文字列ならこれで問題ないのですが、数字が混ざると困ります。
こういうファイルがあった場合の処理を考えてみました。
"abc,d,e","",1,,"fghij,","klmno"
文字列はダブルクォーテーションでくくり、数字はくくらない。
文字列空欄と数字の空欄も含めるようにしました。
カンマを半角スペースに変換するコードです。
Dim strLine As String
Dim strTempLine As String
Dim strTemp() As String
Dim stColumn() As String
strLine = """abc,d,e"","""",1,,""fghij,"",""klmno"""
strTemp = strLine.Split(",")
For i = 0 To UBound(strTemp) - 1
If strTemp(i) = "" Then
strTempLine &= strTemp(i) & ","
ElseIf strTemp(i) = """" Then
'「"」は、最後がカンマで終わる文字列があったことを意味する
strTempLine &= strTemp(i) & ","
ElseIf strTemp(i) = """""" Then
strTempLine &= strTemp(i) & ","
ElseIf strTemp(i).StartsWith("""") = True And strTemp(i).EndsWith("""") = False Then
'「"」から始まる場合は、半角スペースでつなぐ
strTempLine &= strTemp(i) & " "
ElseIf strTemp(i).IndexOf("""") = -1 And Not IsNumeric(strTemp(i)) Then
strTempLine &= strTemp(i) & " "
Else
strTempLine &= strTemp(i) & ","
End If
Next
strTempLine &= strTemp(UBound(strTemp))
'カンマで分割できるようになりました。
stColumn = strTempLine.Split(",")