ダブルクォーテーションを含む文字列の読込表示_1(VB6.0) (No.1の個別表示) [スレッド一覧へ] |
- 日時: 2011/04/05 11:17
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[ファイル入出力][文字列処理][] * * キーワード:CSVファイル,ファイルの読み込み,,,, * ***********************************************************************************
-------------------------------------------------------------------------------------- No.1982 Re:ダブルクォーテーションを含む文字列 投稿者:ゆう(U) [2001/03/29(木)12:16分] --------------------------------------------------------------------------------------
完全に解決されているみたいですが・・・
Split関数(VB6.0)が無くともOKなコードです・・・ ※VB4.0/VB5.0でも動作するはずです VB4.0では動作確認してませんが・・・
myCharを""とすると、Split的に動作します。
'========================================================== '文字列をセパレータで区切り配列にする関数 (Split代用関数:拡張版) '========================================================== ' result = fSplit2(myString, [mySeparator], [myChar], [myCompare]) ' 引数 myString :元の文字列 ' mySeparator:区切り文字(省略可:,) ' myChr :文字列引用符(省略可:") ' myCompare :比較モード(省略可:バイナリ モード) ' 戻値 result :切出した文字列(バリアント配列) ' :エラー時(Empty) '---------------------------------------------------------- 'サンプル) 'Dim varArray As Variant 'Dim varTemp As Variant 'Dim strTemp As String ' 'strTemp = "123,456,""123,456"",""ABC""" 'varArray = fSplit2(strTemp, ",") ' 実際には「,」は半角です ' 'Debug.Print UBound(varArray) - LBound(varArray) + 1 'For Each varTemp In varArray ' Debug.Print varTemp 'Next varTemp '' 通常の For〜Next でもOK '' Dim i As Long '' For i = LBound(varArray) To UBound(varArray) '' Debug.Print varArray(i) '' Next i '結果) ' 4 ←区切られた項目数 '123 ←第1項目 '456 ←第2項目 '"1234,567"←第3項目 '"ABC" ←第4項目 '注意) '文字列引用符と区切り文字の関係に注意して下さい。 '"123,456,""ABC,EFG""H,IJK" ' ^こんなのに注意ってこと(普通はないけど) '---------------------------------------------------------- Public Function fSplit2(ByRef myString As String, _ Optional ByRef mySeparator _ As String = ",", _ Optional ByVal myChar _ As String = """", _ Optional ByVal myCompare _ As VbCompareMethod = vbBinaryCompare) As Variant Dim strArray() As String Dim lngLength As Long Dim lngArrayCount As Long Dim i As Long, j As Long, k As Long
On Error GoTo FUNCTION_ERR
j = 1& lngLength = Len(mySeparator) i = InStr(j, myString, mySeparator, myCompare) k = InStr(j, myString, myChar, myCompare) Do While i > 0& If k = 0 Then k = Len(myString) End If If k < i - 1& Then k = InStr(k + 1&, myString, myChar, myCompare) i = InStr(k + 1&, myString, mySeparator, myCompare) Else ReDim Preserve strArray(lngArrayCount) strArray(lngArrayCount) = Mid$(myString, j, i - j) lngArrayCount = lngArrayCount + 1& j = i + lngLength i = InStr(j, myString, mySeparator, myCompare) k = InStr(j, myString, myChar, myCompare) End If Loop ReDim Preserve strArray(lngArrayCount) strArray(lngArrayCount) = Mid$(myString, j, Len(myString) - j + 1&)
fSplit2 = strArray Exit Function
FUNCTION_ERR: 'エラー発生 'Emptyのまま(TypeName(戻り値)="Empty"で判定可能) End Function
標準モジュールに貼り付けておけば・・・イミディエイトウインドウで 動作確認が出来ます。
? fSplit2("123,456,""ABC,EFG""H,IJK", ",", "")(2) 普通のSplit的動作
? fSplit2("123,456,""ABC,EFG""H"",IJK", ",")(2) Split関数拡張版
|
ダブルクォーテーションを含む文字列の読込表示_2(VB6.0) (No.2の個別表示) [スレッド一覧へ] |
- 日時: 2011/03/28 15:17
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[ファイル入出力][文字列処理][] * * キーワード:CSVファイル,ファイルの読み込み,ダブルクォーテーション,,, * ***********************************************************************************
元質問:データに二重引用符が含まれているcsvファ.. - はな 2007/06/27-10:12 No.9446
csvファイルを読み込む処理をしています。 読み込むcsvファイルは以下のようになっていて、文字列は二重引用符で囲まれ、数字は囲まれていません。
"001","山田健 ", 300.00,"社員 " "002","佐藤"ボブ"隆 ", 500.00,"留学生 "
このようファイルをInput #で読み込むと、 3行目の「佐藤"ボブ"隆」のところで、データが分かれてしまいます。 --------------------------------------------------------------------------------------- Re^2: データに二重引用符が含まれているcs.. - 花ちゃん 2007/06/27-14:30 No.9454 --------------------------------------------------------------------------------------- 今回のような問題なら下記でもOKかと。
Private Sub Command1_Click() Dim AddDat As Variant Dim myString As String Dim i As Long myString = """002""" & "," & """佐藤""ボブ""隆 """ & _ "," & "500.00" & "," & """留学生 """ Debug.Print myString
AddDat = Split(myString, ",") For i = LBound(AddDat) To UBound(AddDat) If Left$(AddDat(i), 1) = Chr(34) And Right$(AddDat(i), 1) = Chr(34) Then AddDat(i) = Mid$(AddDat(i), 2, Len(AddDat(i)) - 2) End If Debug.Print AddDat(i) Next i End Sub
|
|