tagCANDY CGI VBレスキュー(花ちゃん) - ダブルクォーテーションを含む文字列の読込表示(VB6.0) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
ダブルクォーテーションを含む文字列の読込表示(VB6.0)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

ダブルクォーテーションを含む文字列の読込表示(VB6.0) [No.20の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2007/07/15 19:01
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[ファイル入出力][文字列処理][]                                      *
* キーワード:CSVファイル,ファイルの読み込み,,,,                                  *
***********************************************************************************

元質問者の内容
----------------------------------------------------------------
VB6.0、SP3、OSはWin2000という環境で開発をしているのですが、ダブルクォーテーションを含む文字列をうまく読み込むことができません。
改行を含むカンマ区切りのテキスト(CSV?)ファイルを、順次読み込んでいく処理を行いたいのですが、ひとつのデータ中に「"」が含まれていると、そこで切り分けに不都合が生じてしまいます。
----------------------------------------------------------------

---------------------------------------------------------------------------------------
No.1968 RE:ダブルクォーテーションを含む文字列  投稿者:gtk [2001/03/26(月)15:25分]
---------------------------------------------------------------------------------------

プログラムの説明
まず、フォームにCommand1(コマンドボタン)、List1/List2(リストボックス)を配置してください
GetData1の取得結果をList1に、GetData2の取得結果をList2に表示します。
@CSVファイルをバイナリモードで開く。
Aファイルのバイト数分バッファを確保。
Bバッファにファイルの内容を全部とりこむ
Cバッファの内容より、文字列に変換
D変換した文字列をSplit関数で切り分け配列に変換。
E変換した配列から、データの中に","カンマが含まれているかを調べ、調整してGetData1配列とGetData2配列に振り分ける

なお、出力結果の文字列はダブルクォーテーションでくくられておりますので、変換するなり削除するなりしてください。
また、リストボックスは改行はしません。改行部分は"・・"で表示されます。
テキストボックスなどで表示すればちゃんと改行されて表示されます。

'---------------------------------------------------------
'Command1のクリックイベント
'---------------------------------------------------------
Private Sub Command1_Click()
Dim Filenumber As Integer
Dim Buffer() As Byte
Dim StrData As String
Dim BaseGetData
Dim GetData1() As String, Getdata2() As String
Dim Cnt As Integer
Dim Cnt2 As Integer
Dim CommaFlg As Boolean

'リストを初期化する
List1.Clear

'空いているファイル番号を取得
Filenumber = FreeFile
'CVSファイルを開く
Open App.Path & "\" & "test.cvs" For Binary As #Filenumber    '<----@
'CVSファイルのデータを取得
'ファイルの大きさ分のバッファを確保
ReDim Buffer(LOF(Filenumber) - 1)    '<----A
'ファイルの中身を全部バッファに取得
Get #Filenumber, , Buffer    '<----B  
'CVSファイルを閉じる
Close #Filenumber
'バッファの内容を文字列に変換
StrData = StrConv(Buffer, vbUnicode)    '<----C
'区切り文字を","(コロン)で文字列を区切り、BaseGetData配列に入れる
BaseGetData = Split(StrData, ",")   '<----D
'GetData1配列及びGetData2配列数を定義する。
ReDim GetData1((UBound(BaseGetData) + 1) / 2 - 1)
ReDim Getdata2((UBound(BaseGetData) + 1) / 2 - 1)

For Cnt = 0 To UBound(BaseGetData)    '------------------(ここからNextまで)E
    '<文字列の最後の文字がダブルクォーテーションじゃない場合>
    If Right(BaseGetData(Cnt), 1) <> """" Then
        'そのデータの中に","(コロン)があるということなので、現在のデータと次のデータを
        '","で結合した文字列をStrDataにセットする
        StrData = BaseGetData(Cnt) & "," & BaseGetData(Cnt + 1)
        'フラグをセットする
        CommaFlg = True
    
    '<文字列の最後がダブルクォーテーションの場合>
    Else
        'そのデータの中に","(コロン)がないので、現在のデータをそのままStrDataに入れる。
        StrData = BaseGetData(Cnt)
        'フラグをクリアする
        CommaFlg = False
    End If
    
    '<GetData1配列、GetData2配列にデータを割り振る>
    If Cnt Mod 2 = 0 Then
        'StrDataの内容をGetData1(Cnt \ 2)に入れる
        GetData1(Cnt \ 2) = StrData
        'GetData1(Cnt \ 2)の内容をリスト1に表示
        List1.AddItem GetData1(Cnt \ 2)
    Else
        'StrDataの内容をGetData2(Cnt \ 2)似入れる
        Getdata2(Cnt \ 2) = StrData
        'GetData2(Cnt \2)の内容をリスト2に表示
        List2.AddItem Getdata2(Cnt \ 2)
    End If
    'データの中に","(コンマ)が入ってる場合は、2つの文字列を結合したので、
    'カウントを1追加する
    If CommaFlg Then Cnt = Cnt + 1
Next
End Sub
メンテ

Page: 1 |

ダブルクォーテーションを含む文字列の読込表示_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
メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ