アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAでCSVファイルを途中行まで読んだ後で最初の行から読み直す方法を探しています。

【例】aaa.csvというファイルに5行分のデータが入っている。
   これを3行目まで読んだ後で、また1行目から読みたい。
【処理対象ファイル】
 ファイル名:aaa.csv
 ファイルの中身:5行
 1,1,1,1
 2,2,2,2
 3,3,3,3
 4,4,4,4
 5,5,5,5

【読み込み順イメージ】
 1,1,1,1
 2,2,2,2
 3,3,3,3
 1,1,1,1 ←aaa.csvの1行目から読み直し。
 2,2,2,2
 3,3,3,3
 4,4,4,4
 5,5,5,5

現在は処理が思いつかなかったので、読みたいファイルを一度閉じてまた開いてという下記のような無駄な動作にしてしまっています。

for xxx=0 to zzz
open #ファイル番号
Do Until EOF(1)
Line Input #1, 変数
   1度目に3行目が来たら抜ける
Loop
close #ファイル番号
next xxx

しかし、使用するファイルは数十MB~数百MB、Open/Closeも数千は軽く行うので、さすがにこれでは処理が遅すぎてどうにもならなくて困っています。

どなたか良いお知恵をお貸しください。

A 回答 (4件)

もしかしたら、ただ単に読み取りの位置を先頭に戻したいだけですか?


それでしたら「Seek #1, 1」で出来ると思います。
    • good
    • 2
この回答へのお礼

回答ありがとうございます。
はい、その通り読み取り位置を先頭に戻したかったんです。
説明が下手で申し訳ございません。
ありがとうございます。

お礼日時:2016/08/27 21:20

「照らし合わせつつ処理」の内容にもよりますが他の手段があります。




aaa.csvの番号とbbb.csvの番号が同じものを取り出す

というものなら、予め番号でソートしておくことで、両方のファイルを先頭から順番に読むだけで照合することができます。
例) aaaの先頭が 2 、bbbの先頭が 5 なら、 bbbには 5より小さい番号は無いので、2がbbbにあるかを調べる必要はありません。
読み進めても、 aaa=2へ戻る必要はありません。




許されるなら、CSVをSQLServer等の大量のデータに耐えられるデータベースに取り込んで、
JOIN で結合したりして、必要なデータだけ抽出してCSVへ。
そのCSVをExcelで処理、とするのがいいように思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ソートをしておく、というのも一つの手なんですね。
勉強になります。
大容量すぎた場合はSQLServerをかませる方法もあるということも、頭に入れておきます。
ありがとうございました。

お礼日時:2016/08/27 21:26

それでしたら、それぞれを別シートに読み込んでしまってから処理するはダメですか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
シートでは表示しきれない行数のものも処理対象となっているのでシートで開くことは出来ません。

お礼日時:2016/08/27 01:28

全部とりあえず読み込んだ後に3行をコピー&挿入したらダメですか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
挿入したい、というわけではなくデータを確認したいのです。
処理を簡略化して書いてしまったのが原因でわかりにくくなってしまい申し訳ございません。
実際はもうひとつファイル(bbb.csv)があり、そのもうひとつのファイルを1行ずつまわしてaaa.csvと照らし合わせつつ処理をする形を取っています。
bbb.csvを1行読んで、それに対するaaa.csvの対象行が見つかったらbbb.csvを一行進めてaaa.csvをまた最初から読み込みたいという状態です。

お礼日時:2016/08/27 00:48

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

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


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