
やりたいことを先に書くと、最終的には
Linuxのtailに毛が生えたようなアプリをつくりたいと思っています。
開発環境はVB2008 Express Editionです。
で、まずはテキストファイルを後方から読む方法でつまっています。
指定した行数を後方から読むようにしたいと思っています。
最初は全行をいったん読み込んで配列に入れて処理という
書き方をしたのですが、大きなファイルの際にメモリを大量に消費し、
処理速度も遅くなったのでボツになりました。
今はとりあえず、バイナリで後ろから読み込んで改行文字列を
自分で見つけて処理をするという原始的な方法を思い浮かべていますが、
今っぽくないプログラミングであるような気がしています。
このようなことを実現する便利なクラス・機能やエレガントな記述等を
教えていただきたいと思っています。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
FileStreamからバイナリデータとして読み込んで文字列の配列に読み込むといった具合でしょう
dim Buf( 1023) as Byte
FileStreamのSeekメソッドでファイルの末尾へ移動 ... 1)
Seekで読み取りバッファ分だけファイルの先頭側へ移動 ... 2)
Read(Buf, 0, Buf.Length)で読み込み
CR(&H0D)やLF(&H0A)を探しながら BufをLength-1から0へ向けて検索および文字列化 ... 3)
希望の行数未満の場合は1)へ戻って 2)を繰り返し回数分戻して繰り返す
といった具合でしょう
3)の文字列化ですが UnicodeのファイルならSystem.Text.Encoding.Unicodeで
Shift_JIS(含むANSI)などのファイルならSystem.Text.Encoding.Defaultなどで変換が必要でしょう
No.1
- 回答日時:
あんまりエレガントではありませんが、以下のようなやり方をあげておきます。
(参考URL:ファイルを1行ずつ読み込む方法)
(1)String型変数を指定数だけ配列で用意しておきます。(要素数不定なので、引数などから要素数を決めてあげる必要があります)
(2)1行読み込みの結果を、この配列に天下り的に退避します。(最初は1番目に格納、次は1番目を2番目に退避して・・・)
(3)EOFになったら読み込みを終わるようにすると、配列に入っているのが最終行から指定行分の文字列になる。
取り急ぎで動作確認はしていないので、上手くいかなかったら申し訳ありません。
参考URL:http://dobon.net/vb/dotnet/file/readfile.html
ありがとうございます。
この方法なら確かに結果としてメモリを圧迫せずに後方の行のみを取得できますね。
しかし、tailのような機能にしようと思っているのでリアルタイムにファイル監視を行います。ので、ファイルに書き込みが行われるたびに全体を読み直すのは好ましくありません。
数百Mバイトのログファイルでの使用にも耐えられる仕様にしたいと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- docomo(ドコモ) スマフォで急に文字が小さくなってしまった 4 2023/06/11 10:18
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- Windows 10 再起動後 Pinが使用できず、PC(windows11)にサインインできない 3 2022/08/30 20:53
- ドライブ・ストレージ CrystalDiskmarkの測定結果の判定をお願いします 1 2023/02/11 17:42
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
ファイル入力のデータを構造体...
-
VB4.0の「LSet」と同等の機能を...
-
[VBS] 16進数でバイナリファイ...
-
ファイルをメモリに出力する方法
-
perl 特定の文字列をdatファイ...
-
グレースケール画像の画素値を得る
-
エクセルのプロパティーでセキ...
-
エクセルvbaでdocuworksprinter...
-
ExcelブックをGoogleスプレッド...
-
エクセルで複数のコメントのサ...
-
現在のブックを閉じないで、マ...
-
動かなくなってしまった古いVBA...
-
Wordで差込印刷した後に別々の...
-
Windows10でコマンドプロンプト...
-
VB6で7-ZIPのAPIを使用した圧縮...
-
エクセルVBAで一つ上の階層...
-
ファイルサーバ上のファイルが...
-
csvファイルでの日付設定「yyyy...
-
vbsでファイルやフォルダのコピ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バイト型のデータを16進表記で...
-
バイナリファイルの一部分をカ...
-
バイナリファイルでOutOfMemory...
-
DXFファイルをVBで取り込み、図...
-
Cで2次元配列にCSVファイルを...
-
配列操作について
-
日本語を配列に収め、そして表...
-
VBScriptの配列は、要素数を指...
-
テキストファイルを後ろから読...
-
CSVファイルによる検索の高速化
-
グレースケール画像の画素値を得る
-
ファイルをメモリに出力する方法
-
RGBのバイナリデータをCImageに...
-
C++による ファイルの読み込み
-
日本語混じりのファイルをラン...
-
VBAでテキストファイルの改行を...
-
VBでバイナリファイルのコピー...
-
[VBS] 16進数でバイナリファイ...
-
C言語でのファイル読み込み
-
Unicodeのファイル読み込みがう...
おすすめ情報