- 日時: 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
|