CSVの件数 其の2

解決


ぬけさく  2003-09-19 03:39:32  No: 79483

たびたび申し訳ございません。

前回のときはこのように件数を取ることで納得したのですが

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Dim Fso     As New FileSystemObject
    Dim FsoTS   As TextStream
    Dim KENSU   As Integer
    KENSU = 0
    
    'ファイルの末尾から書き込みモードで開きます
    Set FsoTS = Fso.OpenTextFile("test.csv", ForAppending)
    '書き込まれているところまでの行数が知りたいので、現在の行数"-1"
    KENSU = FsoTS.Line - 1  
    Text41.Text = KENSU
    FsoTS.Close
    Set FsoTS = Nothing

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

これだと実際に使うCSVファイルの件数は正しく取れるのですが、べつのテスト用のCSVのときには
最初から4〜6ちかくの値が入ってしまってうまくいきません。

同じ方法でエクセル・ワード・テキストにも実行してみたのですが、正しい値が取れたのは
テキストだけで、エクセル・ワードはCSVと同じような現象がおきています。

原因および対処方法について、考えられる事があればお教え下さい。

os:windows XP 環境:VB6


ぬけさく  2003-09-19 03:41:30  No: 79484

※補足

>最初から4〜6ちかくの値が入ってしまってうまくいきません。

最初というのは、データがまったく入っていない空の状態の事です。


oku  URL  2003-09-20 09:19:25  No: 79485

最初に4〜6行の空白行で、それ以降値が入ったデータで試しましたが、うまくいきましたよ。
エクセル・ワードファイルは
テキスト形式ではないのでもちろんうまくいかないと思います。
もしかして拡張子がCSVになってるだけで、CSV形式ではないとか言うオチでは?


ぬけさく  2003-09-22 19:49:56  No: 79486

okuさん、返答ありがとうございます。

CSV形式ファイルは今回初めてさわるので詳しい事はよくわかりませんが、
実際に使うCSVファイルも別のテスト用CSVファイルもプロパティを
確認したところ[Microsoft Excel CSV ファイル]になっているので、
CSV形式ではあると思いますが・・・(--;


電気  2003-09-22 20:43:20  No: 79487

そのプロパティというのは拡張子がCSVだからCSV形式だと表現されているのだと思われます。
Okuさんのおっしゃっているのは本来XLS等の拡張子になっているファイルの拡張子を"*.csv"にしたようなファイルでは無いのか?  という事だと思います。

んで、私のほうでも実験しましたが、空ファイルを指定しても大丈夫でした。
もしかしてそのテスト用のCSVファイルとやらですが、空白行は入っていないでしょうか?
見た目は空でも、改行が入っていればデータ無しのレコードが一件あることになります。(メモ帳ではちょっと気づき難い)

例えばそのテストデータですが、新規テキスト文書を作成し、ファイル名をtest.csvに変更しただけのファイルを入力にした場合でも4〜6行が返ってきますか?


電気  2003-09-22 21:14:45  No: 79488

ちょっと蛇足かもしれませんが、
当初の目的であったCSVの件数を知り、進行状況を表示する方法に関してですが、
n/212件  みたいな表示をしたいのであれば仕方無いですが
もしパーセント表示でよければ次のような方法もあります。

-------------------------------------------------------------

    Dim Fno     As Long     'ファイル番号
    Dim Fsize   As Long     'ファイルサイズ
    Dim FPos    As Long     '次のレコードの読み込みバイト位置
    Dim CsvRec  As String   '読み込むCSVレコード
    Dim Per     As Long     '全体の読み込み率
    
    Fno = FreeFile
    Open "c:\temp\testcsv.txt" For Input As #Fno
    Fsize = LOF(Fno)
    Do Until EOF(Fno)
        Line Input #Fno, CsvRec
        
        If Len(CsvRec) > 0 Then  '改行のみのレコードは処理しない。
            '書き込み処理を入れる。
        End If
        
        FPos = Seek(Fno)
        Per = (FPos - 1) * 100 \ Fsize
        'プログレスバーのパーセントの更新処理を入れる。
        DoEvents
    Loop
    Close #Fno

-----------------------------------------------------------
この方法だと、件数ではなくバイト単位での進行状況になってしまいますが、
先に件数を調べてから行うより効率的なのと、元のCSVファイルを作るにあたり、Excel等の仕様やユーザーの操作によって、後ろに大量の空白レコードが入ってしまった場合等でも対処が出来ます。

一応参考までという事で


oku  URL  2003-09-23 08:07:17  No: 79489

CSV形式とは、所詮テキストファイルです。
CSVファイルをテキストエディタ等(メモ帳や秀丸)で開いてみてください。
中身がちゃんと見えればOKです。
テキストファイルにカンマやタブで、さも項目があるように見せてるだけです。
ちなみにエクセルファイルをテキストエディタ等で開いてみれば
違いは一目瞭然です。文字化けみたいでちゃんと見えないはずです。
エクセルは、セルと言う概念があるので、
ファイルの中に、どこのセルに値が入っているや
セルに罫線や結合されているなどの情報も入っていると思うので、
テキストエディタ等では人間が見ても解読不能な化け化けな文字が表示されます。
マイクロソフトの人間なら解読出来るのかな?(~_~)


ぬけさく  2003-09-24 18:29:44  No: 79490

okuさん 電気さん ご教授ありがとうございます。

調べてみたら文字化けしました。未熟者ですいません m(_ _)m

ちゃんとしたCSV形式ファイルでは正しく件数が取れることが確認できました。

電気さんの方法を参考にしてこれからいろいろ改良してみたいと思います。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加