• ベストアンサー

csvファイル 項目数取得

おはようございます。 VB6.0使ってます。 よろしくお願いします。 csvファイルの項目数を数えたいのですが、新・旧レコードの2つが混ざっており、項目数も違います。項目にはデータだけでなく空もあります。 例: 001,suzuki,19800101,,tokyo,F 002,tanaka,19800202,A 新は項目が6あるが 旧は4つしかない。 時々、項目には空も混ざっている。 For文で数えてみようとしたのですが、旧だと項目数が足りないので数えられないですねf^^; 同様に6番目があるかないかとかアホウなことも考えましたがこれも無理でした。 アドバイス、ヒント、ツッコミ、よろしければお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#24240
noname#24240
回答No.4

Splitを使うと、カンマ区切り(その他でもできますが)のデータを 分解することができます。 分解したデータを格納した配列の要素数を取得すれば、項目数がわかるのでは? 参考までに、以下にサンプルとしてコードを記します。 (エラー処理などは特につけてません。) ミスがあったらごめんなさい('';) Public Sub ReadFile() Dim strFilename As String Dim intFileNo As Integer Dim blnOpenFlg As Boolean Dim vntBuf As Variant Dim strBuf As String Dim lngCnt As Long Dim lngDataCnt As Long '初期値設定 blnOpenFlg = False 'ファイル名設定 strFilename = "C:\TEST.csv" intFileNo = FreeFile() 'ファイルオープン Open strFilename For Input As #intFileNo 'ファイルオープンしたらフラグOn blnOpenFlg = True lngCnt = 1 Do While Not EOF(intFileNo) 'データを一行単位で読込 Line Input #intFileNo, strBuf 'Splitをつかって、取り出した文字列を分解 vntBuf = Split(strBuf, ",") '要素数を取得 lngDataCnt=uBound(vntBuf)+1 MsgBox Cstr(lngcnt) & "行目の項目数は" & Cstr(lngDataCnt) & "個です。" lngCnt = lngCnt + 1 Loop 'ファイルを閉じる If blnOpenFlg = True Then Close #intFileNo blnOpenFlg = False End If End Sub

akigiri0213
質問者

お礼

お返事ありがとうございます! おお、VBにもsplitあったんですね! Javaを少ししていたので知ってはいたのですが… VBにもsplitが… あ、借りたVBの本が4.0でした! そりゃ載ってねえって話ですよねf^^;

akigiri0213
質問者

補足

この場をお借りしてお礼を言わせて頂きます。 皆様のおかげで出来上がりました(^-^) ポイントは均等に入れたいところですが、#2と#4の方をメインにブレンドして作らせていただいたので今回はお二方にポイントを入れておきます。 本当にありがとうございました(^-^)

すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#22222
noname#22222
回答No.3

s_husky です。 ErrMessage()は無関係でした。 ライブラリを余分にコピーしていました。

すると、全ての回答が全文表示されます。
noname#22222
noname#22222
回答No.2

項目数ですと、次のようにして求めることが可能です。 Private Sub コマンド0_Click()   Dim I    As Integer   Dim N    As Integer   Dim Datas() As String      Datas() = FileReadArray("c:\temp\vbtest.csv")   N = UBound(Datas())   For I = 0 To N     MsgBox CharCount(Datas(I), ",") + 1   Next I End Sub なお、ここでは、FileReadArray()、CharCount()関数を利用しています。 Public Function FileReadArray(ByVal FileName As String) As String() On Error GoTo Err_FileReadArray    Dim fso    As FileSystemObject    Dim fil    As File    Dim txs    As TextStream    Dim strText  As String    Dim strTexts() As String       Set fso = New FileSystemObject    Set fil = fso.GetFile(FileName)    Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)    strText = txs.ReadAll    strTexts = Split(strText, Chr$(13) & Chr$(10)) Exit_FileReadArray:    FileReadArray = strTexts()    Exit Function Err_FileReadArray:    MsgBox Err.Description & "(FileReadArray)", vbExclamation, " 関数エラーメッセージ"    strTexts() = Split("")    Resume Exit_FileReadArray End Function Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CharCount(ByVal Text As String, ByVal C As String) As Integer   Dim I As Integer   Dim L As Integer   Dim N As Integer      L = Len(Text)   For I = 1 To L     N = N + Abs(StrComp(Mid$(Text, I, 1), C, vbTextCompare) = 0)   Next I   CharCount = N End Function

akigiri0213
質問者

お礼

お返事ありがとうございます! UBoundで上限値返せば早いですねー! すっかり忘れていたましたf^^;

すると、全ての回答が全文表示されます。
回答No.1

ちょっと正式なやり方がわからないのですが、俺だったら1行丸ごと読み込み","の数を数えます。 後は応用で何とかなるかな?と思います。 サンプルプログラムとして、 Open "test.csv" For Input As #1 Line Input #1, l_in Close #1 cnt = 0 text_len = 0 Do text_len = InStr(text_len + 1, l_in, ",") cnt = cnt + 1 Loop While (text_len > 0) Label1.Caption = cnt

akigiri0213
質問者

お礼

お返事ありがとうございます! なるほどー!カンマを数えれば早いですね! InStrはそういえばあったような…

すると、全ての回答が全文表示されます。

関連するQ&A