- ベストアンサー
テキストファイルの入力について教えてください。
可変長レコードのテキストファイルを1レコードずつ読み込んで処理をしたいと思っています。 改行コードで区切られているので、line inputで読み込もうとしていますがうまくいきません。 テスト用に入力ファイルを小さくするとうまくいくのですが、目的のファイル(180MB)を読み込もうとするとフリーズしたような状態になってしまいます。 どうすればよいかお知恵を拝借できないでしょうか。 EXCEL2003 VBAです。 よろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
テスト用ファイルの作成方法が分からないので見当違いかもしれませんが、ファイルの改行コードがCRLF以外(LF単独など)になっていませんか?テスト用ファイルを元ファイルからテキストエディタなどで切り出して作成されているなら、この可能性があります。
その他の回答 (6)
- rentahero
- ベストアンサー率53% (182/342)
#6氏ナイス。 Line Input #ステートメントでは、vbCr または vbCrLf が行の区切りとして認識されるのですが、vbLf に関しては、そのまま読み込まれるため、改行がunix形式のlfのみだと全部を読み込もうとしますね。 もしftpでバイナリ形式を用いてファイルを取得しているのであれば、ascii形式で取得しなおしてください。改行コードの変換(lf→crlf)がなされます。
- rentahero
- ベストアンサー率53% (182/342)
もしかしてexcelのVBAでのline input って、ファイル全体をバッファリングしようとしてるか、ファイルの行数をチェックしてるのか、テンポラリファイルにコピーしてるんじゃないかな。タスクマネージャでメモリ使用量をチェックしたり、ファイルがどうなってるか確認してみないといけないかもしれません。 もしそうなら、excelのVBAでは巨大ファイルの処理はまずいということなのかもしれないです。 WSHで処理したら大丈夫だったりしないですか(自信なし) ちなみに、ただのファイルの分割処理であれば、私ならC++でやります。知り合いに聞いたらperlでやるそうです。
- ramuta
- ベストアンサー率32% (74/227)
#3の方がご指摘されているように 「DoEvents」 は鉄則ですね。 フリーズの様な状態とは別の話ですが、 180MBのファイルをどの様にシートに 展開しているかわかりませんが、 この処理で全てのデータがシートに入り切るの でしょうか? 対象レコード数が10万件とか言うことは ないですよね? 以上、蛇足でございました。
- rentahero
- ベストアンサー率53% (182/342)
line inputの後か前に DoEvents を、置いてみたらどうでしょう。 速度は相当犠牲になるかもしれないけど、(シートにデータを取り込んでいるんだろうから、再計算が入るはずです)ループの手前(ファイルオープン付近)でデータを入れるシートに対して再計算を禁止して、ループの後で再計算を許可するようにしましょう。 あと、取り込み中を表示するウィンドウをモーダルダイアログにして、その画面上で現在処理中の行数等の情報や、もっと簡単にプログレスバーを表示するなども効果的です。この場合も、DoEventsは必須ですが、更新されるべき場所が、ダイアログだけであれば(シートの再計算が禁止されていれば)速度はでます。
補足
ステップ実行するとline inputの行になった瞬間にフリーズ(のような状態?)になります。 処理は、テキストファイル(ログファイル)を読み込んで日付等ごとに分割してテキストファイルに出力するといったもので、エクセルのシートは使用しません。
- LucyDiamond
- ベストアンサー率48% (21/43)
現在、どのようなソースコードを書かれていますか?教えていただければ、具体的なアドバイスが出来るかと思います。補足をお願いします。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>目的のファイル(180MB) どのような処理をしているかわかりませんが、巨大すぎると思いますよ。 ファイルを分割してから取り込んでみてはいかがでしょうか?
補足
レコード数が多すぎて、そのままではエクセルで読み込めないため、日付等で分割しようとしています。 ステップ実行してみると、最初のline inputを実行した瞬間に当該現象になってしまします。