• ベストアンサー

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

  • CSVファイルからn個目の項目を取得する方法

    タイトルの通りCSVファイルからn個目の項目を取得する方法を教えていただきたいです。 例 1レコードあたり100項目あるCSVファイルから1個目、10個目、13個目の項目を取得する。 1レコードあたり項目数が少なければ下記コマンドでいけると思うのですが項目が多いと非常に遅くなってしまいます。 (やり方が悪いだけかもしれません) sed -e 's/¥(.*¥),¥(.*¥),•••••/¥1,¥10,¥13/' ファイル名 よろしくお願いします。

  • SQLServerで項目数が異なるCSVファイルを取り込む方法

    (先ほど古いIDで登録してしまったため、削除して新しいIDで登録しなおしました) お世話になります。 SQLServer2005 を使っています。 行によってデータ型も項目数も異なる CSV ファイルがあり、それを テーブルに読み込みたいと思っています。 (POSのデータです) サイズが比較的大きいので、BULK INSERT を使いたいと思い、 以下のように記述してみました。 BULK INSERT T_hoge FROM 'c:\hoge.csv' WITH (  DATAFILETYPE = 'char',  FIELDTERMINATOR = ',',  ROWTERMINATOR = '\n' ) CSV項目数が可変なので、取り込む側のテーブルの項目数に 余裕を持たせ、1行1レコードで取り込みたいのですが、 改行を無視して取り込まれてしまうようです。 項目数可変のCSVを取り込む方法があれば教えてください。 宜しくお願い致します。

  • CSVファイル操作

    VBでCSVを操作しているのですが、わからないことがあるので教えてください。 1.CSVファイル(改行区切り)のレコード数を取得するにはどうすればいいですか? 2.CSVファイル(改行区切り)の最初のレコードのみ削除するにはどうすればいいですか?   また、レコードを指定して削除することはできますか? 3.CSVファイル(改行区切り)のレコードを指定して内容を変更することはできますか? Windows XP , VB6

  • 検索とレコード数(CSVファイルより)

    PHP初心者です CSVファイルを参照して 項目で検索 検索した内容のレコード数(件数)を 表示させる関数(方法)を教えて頂きたいです 今までMysqlで操作していたのですが CSVファイルに変わって 困ってしまいました よろしくお願いします

    • 締切済み
    • PHP
  • CSVファイルを読んでシートに書き込む方法

    エクセルのマクロ(VB6.5)でCSVファイルをよんでシートに書き込みたいのですが誰か教えて下さい。 例えば CSVファイルはこんな感じだとします。 ファイルID:test.csv ファイル内容  (1レコード)123,123,123,123,123,123  (2レコード)456,456,456,456,456  (3レコード)789,789,789,789 書き込むシートは「abcシート」とします。 CSVファイルはカンマ区切りですがレコード毎にカンマ区切りのデータ数が違います。 シートには指定したセルに書き込めば一番いいのですが、上から順番に書き込んでもいいです。 申し訳ありませんが、宜しくお願い致します。

  • CSVから読み込んだデータの保持とソート

    お世話になっています。VB.NET+CSVに関する質問です。 現在VB.NETで、CSVから読み込んだレコードをある項目を基準に並び替え、一覧にして画面に表示するというプログラムを作っています。 こういう場合のCSVから読み込んだデータの保持の方法と、その並び替えの方法にはどういうやり方がありますか? いくつかのパターンがあると思いますが、教えてください。 以下はCSVの情報です。 ・1行が1件のレコード ・項目1を昇順で並び替える ・CSV項目:項目1(半角英数字)項目2(タブ)項目3(半角・全角文字) ・CSV件数:1000行以下

  • CSVファイルの内容を編集する方法について

    こんにちは。CSVファイル(1レコード9項目、平均50レコード)を何らかのオブジェクトに格納し、各レコードの項目を編集・一括更新を行う方法はないか、現在模索しております。以前のスレッドではOLEのエンジンを使用してCSVファイルを模擬的にDBとしてデータグリッドに表示させる方法を確認し、試行しましたが、編集できない&レコード読み飛ばしができないなど、不都合があったため、改めて質問させていただきました。一番思いつくのは、テキストボックスを2次元に並べて、コマンドボタンで一括保存などがありますが、コントロール数やオブジェクト数にも配慮した方法がありましたら、お教えください。

  • 文字として, "を使用するCSVファイルの取り扱い

    題名の通り、文字として,(カンマ)、"(ダブルクォート)を使用するCSVファイルの取り扱いについて教えて頂きたいです。 読み込むCSVファイルの形式は以下の通りです。 ・項目の最初と最後には"が設定される ・項目内の,は文字として扱う 例:"5,000" 5の後の,は項目内に設定されている為、文字として扱う ・項目内に"を設定する場合は""と設定する ・レコードは改行コード単位 例:"A","5,000","B","C""D""" 1項目目:"A" 2項目目:"5,000" 3項目目:"B" 4項目目:"C""D""" 上記の様なCSVファイルを読み込み、項目を取得するにはC言語ではどの様に対応するべきでしょうか。 下記方法で対応出来そうですが、効率が非常に悪いと思われます。 (1)fgetsにて1行分のレコードを読み込む。 (2)取得したレコードに対して、カンマを指定してstrtokを実行し、,間の値を取得する。 (3)取得したカンマ間の項目のダブルクォートの数をカウントする。 (4)-1カウント数が偶数の場合 ,を区切り文字とし、取得した値を1項目として扱う。 (4)-2カウント数が奇数の場合 ,を文字とし、次のカンマ間の項目を取得し、連結する。 連結した値のダブルクォート数をカウントし、カウント数が奇数か偶数か判定する。 (5)上記処理をstrtok結果がNULLになるまで繰り返し、NULLが帰ってきたら次の行のレコードを読み込む。 (6)上記処理をEOFまで繰り返す。 以上、よろしくお願いします。

  • 改行のあるCSVファイルをExcelに読み込みたい

    CSVファイルをExcelにインポートしたいのですが CSVファイルのデータ内に改行が入っていたので、レイアウトが崩れて、 うまくExcelにインポートできない状態です。 改行を置き換えで取り除くと、すべて横並びになってしまいます。 1レコードは59項目と決まっているのですが、手作業で改行を入れるのは 数が多く難しそうです。 なんとかうまく取り込む方法はないでしょうか? プログラミングは全くわかっていない初心者ですが、 エクセルのVBAにコピペして実行することは可能です。。。 カテ違いだったらすみません><

  • バッチでCSVを処理する時、空の項目があった場合

     例えば、以下のような二行からなるCSVファイルが有ります。 TK,001,A,DC, ,5,12 TK,002,B,DC,13,6,13   バッチで、このファイルを読み込んで、以下のようなレイアウトでCSVファイルを出力したいです。 TK,A, ,12 TK,B,13,13  しかし、一行目のデータに空の項目が発生していますので、 for /f "delims=, tokens=1-7" %%I in (sample.csv) do ( … )  で処理した場合、自動に、空の項目を飛ばし、次の項目を読み込みますので、出力ファイルは以下のようになってしまいます: TK,A,5 ,12 TK,B,13,13    こういうことを避けたいですが、なかなかいい方法が見つかりません。解決方法をご存知の方、教えていただけませんか?

専門家に質問してみよう