プロが教える店舗&オフィスのセキュリティ対策術

おはようございます。
VB6.0使ってます。
よろしくお願いします。

csvファイルの項目数を数えたいのですが、新・旧レコードの2つが混ざっており、項目数も違います。項目にはデータだけでなく空もあります。

例:
001,suzuki,19800101,,tokyo,F
002,tanaka,19800202,A

新は項目が6あるが
旧は4つしかない。
時々、項目には空も混ざっている。
For文で数えてみようとしたのですが、旧だと項目数が足りないので数えられないですねf^^;
同様に6番目があるかないかとかアホウなことも考えましたがこれも無理でした。

アドバイス、ヒント、ツッコミ、よろしければお願いいたします。

A 回答 (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

この回答への補足

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

補足日時:2006/09/07 09:44
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/07 09:44

s_husky です。



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

項目数ですと、次のようにして求めることが可能です。



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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/07 09:43

ちょっと正式なやり方がわからないのですが、俺だったら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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/07 09:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A