テキストファイルから該当部分コピーする

解決


トッシー  2004-09-16 20:41:13  No: 116328

かなり多くのプロシージャ(100個くらい)から特定ひとつに検索をかけて

SubA2X()
〜〜〜
End Sub

を切り抜いて他のテキストファイルにペーストするというプログラムを作りたいのですが、イメージがわきません。かなり苦しんでいます。関数などヒントをいただけませんか


トッシー  2004-09-16 20:42:56  No: 116329

検索対象の100個くらいのプロシージャはテキストファイルに書いてあります


ねろ  2004-09-16 20:57:37  No: 116330

InStr関数で『Sub XXX』を探して
更にそこから
InStr関数で『End Sub』を探して
その範囲をMid関数で切り取る。


トッシー  2004-09-16 21:07:54  No: 116331

すみません。ヘルプなどで見てみたのですが関数の使い方などがわかりません。使用例に載っているような文字列を対象としたものではなくファイル全体に対して行うとなるとどのような構成になるのでしょうか?
お手数ですがお願いします


KG  2004-09-16 21:39:23  No: 116332

ファイルを一行ずつ読み込んで、ねろさんが提示してるような方法をとる。

というのではダメなのですか?


葉月  2004-09-16 21:40:13  No: 116333

おそらくトッシーさんの質問の仕方だと質問内容が間違ってる気がしてしょうがない
>関数の使い方などがわかりません
あってる間違ってるにかかわらず使い方の調べ上げた関数を記述してください
そのヘルプの何が理解できないのかを記述してください

そうでない場合の質問の仕方は・・・
どの関数を使えばいいのかがわかりませんが正しくなる

手作業ならどうやってやったら実行できるか
その手順の中で何がわからないのかを教えてください
(トッシーさんがどこまで理解しているのかが皆にわかるようにするため)

本来ならば・・・
>どのような構成になるのでしょうか?
ここを考えるのがプログラマだと思います

過去に文字列系の質問は多々出ているので検索してみてはいかがでしょうか?
(極々最近もあった気がするし・・・)

私なり解決なら
とりあえずファイルシステムオブジェクトでOKじゃないの?
ファイルシステムオブジェクトって何?って質問は無しの方向で・・・


Say  2004-09-16 21:45:09  No: 116334

処理系を問わないなら、
awkかperlあたりでフィルタ風に作ったほうが手取り早いような・・・。


トッシー  2004-09-16 22:01:51  No: 116335

すいません。自分はかなりの初心者です、つまりは一行ずつループさせて一行ずつに検索をかけるということでしょうか?ほんとにゼロからわからないのです。InStrのヘルプにある使用例はわかるのですが、これをかなりの行数があるファイル全体に対して行うとはどういうことなのでしょうか。


トッシー  2004-09-16 22:11:24  No: 116336

サンプルコードをひとつでもいただければと思います。
ご迷惑かけて申し訳ありません


葉月  2004-09-16 22:52:57  No: 116337

一行ずつ検索をかけるということは・・・

Open 目的ファイル For Input As #iFileNo

Line Input #intFileNo, str変数

Do Until EOF(FileNo)

    If str変数 = "目的文字列" Then
        blnフラグ = True
    ElseIf str変数 = "End Sub" And blnフラグ = True Then
        blnフラグ = False
        Exit Do
    Enf If

    If blnフラグ = True Then
        str変数をどこかに退避する処理
    End If        

    Line Input #intFileNo, str変数

Loop

これで一行ずつ読みながら進めるはず・・・
デバッグはしていないのであくまで設計程度にサンプルを捕らえてください
サンプルで必要な変数の宣言とかは自分で考えてね・・・


葉月  2004-09-16 22:55:03  No: 116338

これは私のイージーミス・・・
EXITする前にEndsubも書き出してね


葉月  2004-09-16 22:57:20  No: 116339

FileNo変数もいろんな名前がついてしまいました・・・ごめんない
どれかに統一してください・・・
intFileNo か iFileNo か FileNoかに・・・
あと6.0のコードでもよかったのだろうかとふと疑問・・・


ねろ  2004-09-16 23:08:38  No: 116340

もしRichTextBoxが使えるんだったら、RichTxtBoxと普通のTextBoxを2つ、
コマンドボタンを1つ置いて、Text1に探す文字を入れて
Option Explicit
Private Sub Command1_Click()
    Dim t1 As Long, t2 As Long
    RichTextBox1.LoadFile App.Path + "\" + "test.txt" '読み込むファイル名
    t1 = InStr(1, RichTextBox1.Text, Text1.Text, vbTextCompare)
    If t1 > 0 Then
        t2 = InStr(t1, RichTextBox1.Text, "End Sub", vbTextCompare)
        Text2.Text = Mid(RichTextBox1.Text, t1, t2 - t1 + Len("End Sub"))
    End If
End Sub
こんな手もあるかも。


特攻隊長まるるう  2004-09-16 23:46:08  No: 116341

>サンプルコードをひとつでもいただければと思います。
同じような質問を過去ログ検索せずに質問し、同じような
コードを何度も要求すると、今後、過去ログ検索した時に
同じキーワードで同じようなソースコードが大量に引っかかる
こととなり、効率が悪くなります。たいへん迷惑しますので
過去ログ検索はするようにして下さい。


トッシー  2004-09-16 23:48:27  No: 116342

で、できました。理想の形です!!!!!!!!!
ネロさんありがとうございます。
そこでお願いなのですがコードにもう少しコメントをつけていただきたいのですがよろしいでしょうか?


葉月  2004-09-16 23:49:58  No: 116343

追記・・・
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200409/04090048.txt

↑のsayさんの案なんてそのまんまじゃない?
FileStreamってやつ


じゃいあん  2004-09-17 00:54:22  No: 116344

葉月さんの上レスの書き方だとかなりの初心者さんみたいなんで混乱しそうですね。

>↑のsayさんの案なんてそのまんまじゃない?
>FileStreamってやつ

ここの記述は「ファイルから内容を読み込む」部分という意味でそのまんまですね。

検索は別ロジックで。


葉月  2004-09-17 01:42:31  No: 116345

>じゃいあんさん
そうですね、失礼しました

上記発言は
テキストをライン(1行)で読むのではなく、改行も含めて読込を行うというものです
コントロールを使っている、ねろさんの考えに類似し
改行も含めて一括で取り込んでしまう方法が記述されているだけです

でも・・・
>トッシーさん
>そこでお願いなのですがコードにもう少しコメントをつけていただきたいのですがよろしいでしょうか?
いくら初心者とはいえちょと努力が足りない気がするのは私だけでしょうか・・・
一体何がわからなくてコメントをつけてほしいのかがわからないです・・・
わからないポイント絞って再度質問することをお勧めします

おそらく今度はリッチテキストボックスとか他の関数のはずだし
検索すればわからないポイントは出てくるはずです


ねろ  2004-09-17 01:57:16  No: 116346

コメントと言うか解説してほしいと言うことでしょうか。
今回の検索文字列には改行が含まれていますので、
一行ずつ読み込むのでは処理が面倒でしょう。
ファイルを全て読み込むとなるとFSO(FileSystemObject)
となりますが、初心者の方はRichTextBoxを使って見るのも一興です。
RichTextBoxは結構優れたコントロールで、特にファイルの読み書きに関しては、
RichTextBox1.LoadFile ファイル名一行で読み込みます。又書き込みは
RichTextBox1.SaveFile ファイル名の一行で書き込んでしまいます。
一見遅い様に思われますが、処理は高速です。
また普通のTextBoxのような64Kの長さ制限もありません。
>t1 = InStr(1, RichTextBox1.Text, Text1.Text, vbTextCompare)
ここがわからないのでしょうか?
RichTextBox1にのテキストの中から、Text1.Textに書かれている文字の
最初の位置を返します。
t2 = InStr(t1, RichTextBox1.Text, "End Sub", vbTextCompare)
はt1で見つけた文字列の位置から検索して最初の"End Sub"の位置を見つけます。
これは"E"の位置なので、切り出したい文字列の"nd Sub"までの6文字分をこれに
足さなくてはなりません。
t2 - t1 + Len("End Sub") となっていますが、実際は
t2 - t1 + 1 + Len("End Sub") - 1  をまとめています。
InStrに関してはご自分でMSDNで調べ見て下さい。使用例が出ていますので
わかると思いますが、解らなかったらその項目を質問してください。
vbTextCompareを指定すると大文字小文字関係なく検索します。

>いくら初心者とはいえちょと努力が足りない気がするのは私だけでしょうか・・・
葉月さん、このレスが付く前に殆ど書いてしまったので、このまま投稿させてもらいます。
プログラムを書くのに2分、説明を書くのに20分。(^^;


トッシー  2004-09-17 02:39:02  No: 116347

ほんとに申し訳ありませんでした。皆様のおっしゃるとおりです。
お恥ずかしい限りです。以後慎みたいと思います。


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




  


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