- ベストアンサー
テキストファイルから文字列の表示
あるテキストファイルを読み込んで、OPEN_"*.*"(_は空白、空白の長さは固定されていない/*はワイルドカード)という形の文字列から *.* だけをテキストボックスに表示させたいのですが、どなたか教えてください。当方、初心者で全然わからずに困っています。 例.ABC.txtの中身 OPEN "BLGCOMON.DAT" AS #1 LEN=32 FIELD #1,1 AS BLG1$,8 AS BLG2$,1 AS BLG3$,20 AS BLGDUM$,2 AS BLGDEV$ OPEN "ABCDEF.TXT" AS #1 LEN=32 GET #1,1 LSET BLG1$="1" LSET BLG2$="WSKMMKY " MID$(BLGDUM$,1,6)=MID$((STR$(WKRC)),2) MID$(BLGDUM$,7,6)=ISAMDAT$ LSET BLGDUM$ = BLGDUM$ OPEN QWER$ PUT #1,1 CLOSE #1 このテキストファイル(ABC.txt)の場合、1行目の「OPEN "BLGCOMON.DAT"」と3行目の「OPEN "ABCDEF.TXT"」が質問の文字列に当てはまります。テキストボックスには「BLGCOMON.DAT ABCDEF.TXT」のみが表示されるようにしたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
補足について Private Sub Command1_Click() CommonDialog1.Filter = "テキスト(*.txt)|*.txt|すべて(*.*)|*.*" CommonDialog1.FilterIndex = 1 CommonDialog1.Flags = cdlONFileMustExist '既存ファイルのみ読み込み CommonDialog1.CancelError = true on error resume next CommonDialog1.ShowOpen if ( err = 0 ) then FileRead CommonDialog1.FileName end if on error goto 0 End Sub Private Sub FileRead(FL as String) Dim FileNo As Integer 'ファイル番号 Dim strDAT As String '行データ Dim strELM As String 'マルチステートメントの分解 Dim pot1 As Integer, pot2 As Integer '『:』、『OPEN』の位置 Dim pDB1 As Integer, pDB2 As Integer '『"』の位置(前と後) FileNo = FreeFile Open FL For Input As #FileNo 'フォルダをセットする While Not EOF(FileNo) Line Input #FileNo, strDAT '行データを読み込む strDAT = strDAT & ":" pot1 = InStr(strDAT, ":") 'マルチステートメント対応 While pot1 > 0 strELM = Left(strDAT, pot1) 'マルチステートメントの分解 pot2 = InStr(strELM, "OPEN") 'OPENの位置 While pot2 > 0 pDB1 = InStr(strELM, Chr(&H22)) '『"』の位置 If pDB1 > 0 Then '前の『"』の位置 pDB2 = InStr(pDB1 + 1, strELM, Chr(&H22)) If pDB2 > 0 Then '後ろの『"』があったら Text1.Text = Text1.Text & _ Mid(strELM, pDB1 + 1, pDB2 - pDB1 - 1) & vbCrLf End If End If pot2 = InStr(pDB2 + 1, strELM, "OPEN") 'OPENはもうないか Wend '次の命令文 strDAT = Mid(strDAT, pot1 + 1) pot1 = InStr(strDAT, ":") Wend Wend Close #FileNo End Sub こんな感じでいいと思います。 すこしずつ直していますので元に戻しても大丈夫だと思います。 No.2の方の最後はCloseで閉じてください。
その他の回答 (4)
- taisuke555
- ベストアンサー率55% (132/236)
pDB1 = InStr(strELM, Chr(&H22)) '『"』の位置 ↓ pDB1 = InStr(pot2+1,strELM, Chr(&H22)) '『"』の位置 にしたらどうでしょうか? 確認はしていませんが、OPENがあった場合、OPENの次から["]を検索します。 1つ1つのバグにしか対応しなくてすみません。
お礼
ありがとうございます。本当に助かります。
補足
細かい事を言ってすいませんが、OPEN_"*.*"の抽出が、*.*の形だけではなく、OPEN_"*"(つまり、OPENのあとに" "があると" "をすべて拾ってくる状態)で認識されています。*.*の形だけで抽出は出来ないものでしょうか。あと、" "の中に、":"(例.OPEN "C:temp",OPEN "ASD:")があると、":"がある所は無視されてしまいます。これもどうにかならないでしょうか。(マルチステートメントが関係しているのか?マルチステートメントの意味もろくに知らないんですけどね(汗)。) taisuke555さんには非常にお世話になりましたので、この質問はとりあえず打ちきってポイントの発行としたいと思います。上の疑問は「テキストファイルから文字列の表示 2」で答えてほしいのですが、よろしいでしょうか。
- taisuke555
- ベストアンサー率55% (132/236)
テキストファイルにOPENがあって、その後に"が無い場合に 無限ループに入っているようです。 While Not EOF(FileNo) Line Input #FileNo, strDAT '行データを読み込む strDAT = strDAT & ":" pot1 = InStr(strDAT, ":") 'マルチステートメント対応 While pot1 > 0 strELM = Left(strDAT, pot1) 'マルチステートメントの分解 pot2 = InStr(strELM, "OPEN") 'OPENの位置 While pot2 > 0 pDB1 = InStr(strELM, Chr(&H22)) '『"』の位置 If pDB1 > 0 Then '前の『"』の位置 pDB2 = InStr(pDB1 + 1, strELM, Chr(&H22)) If pDB2 > 0 Then '後ろの『"』があったら Text1.Text = Text1.Text & _ Mid(strELM, pDB1 + 1, pDB2 - pDB1 - 1) & vbCrLf Else '-------------* pDB2 = pot2 +1 '-------------* End If Else '-------------* pDB = pot2 + 1 '-------------* End If pot2 = InStr(pDB2 + 1, strELM, "OPEN") 'OPENはもうないか Wend '次の命令文 strDAT = Mid(strDAT, pot1 + 1) pot1 = InStr(strDAT, ":") Wend Wend -----*の部分を追加してみてください
お礼
ありがとうございます。 Else pDB2 = pot2 +1 End If Else pDB = pot2 + 1 End If を追加したら大体、うまくいきました(ただし、5行目はpDB2 = pot2 + 1に変えた)。
補足
お礼に「大体、うまくいきました」と書きましたが、字の通り、すべてがうまくいったわけではないのです。 一部のファイルは相変わらずループしたままです。 "BLGCOMON" AS #1 LEN = 32 ' FILE OPEN "ABC.TXT" OPEN などのように「OPENの前に"*****"("*****"の中は"."が有る無し関係ない)がある」と無限ループしてしまいます。 "BLGCOMON" AS #1 LEN = 32 ' FILE OPEN ( #1 ) などのように、違う行に"*****"がある分には問題ないようです。 相変わらず、わからずに困っているので、教えていただけませんでしょうか。
- nishi6
- ベストアンサー率67% (869/1280)
処理例を書いてみました。 コマンドボタン(Command1)とテキストボックス(Text1)を使っています。 テキストボックスの表示は、長くなるので改行しています。MultiLineをTrueにして下さい。 マルチステートメントは対応しているはずです。 間違えた構文、『" "』にはさまれたOPENはダメかもしれません。長くなるので・・・ ご参考に。 Private Sub Command1_Click() Dim FileNo As Integer 'ファイル番号 Dim strDAT As String '行データ Dim strELM As String 'マルチステートメントの分解 Dim pot1 As Integer, pot2 As Integer '『:』、『OPEN』の位置 Dim pDB1 As Integer, pDB2 As Integer '『"』の位置(前と後) FileNo = FreeFile Open "D:\・・・\・・・\ABC.txt" For Input As #FileNo 'フォルダをセットする While Not EOF(FileNo) Line Input #FileNo, strDAT '行データを読み込む strDAT = strDAT & ":" pot1 = InStr(strDAT, ":") 'マルチステートメント対応 While pot1 > 0 strELM = Left(strDAT, pot1) 'マルチステートメントの分解 pot2 = InStr(strELM, "OPEN") 'OPENの位置 While pot2 > 0 pDB1 = InStr(strELM, Chr(&H22)) '『"』の位置 If pDB1 > 0 Then '前の『"』の位置 pDB2 = InStr(pDB1 + 1, strELM, Chr(&H22)) If pDB2 > 0 Then '後ろの『"』があったら Text1.Text = Text1.Text & _ Mid(strELM, pDB1 + 1, pDB2 - pDB1 - 1) & vbCrLf End If End If pot2 = InStr(pDB2 + 1, strELM, "OPEN") 'OPENはもうないか Wend '次の命令文 strDAT = Mid(strDAT, pot1 + 1) pot1 = InStr(strDAT, ":") Wend Wend End Sub
お礼
*.*だけを抽出できました。ありがとうございます。
補足
*.*だけ抽出できたのはいいのですが、回答していただいたコードだと、「Open "D:\・・・\・・・\ABC.txt"」の" "で指定したファイルしか開きませんよね。私としては、ダイアログボックスを表示して、その中からファイルを選んだ上で、*.*だけ抽出したいのです。 ダイアログボックスを表示して、その中からファイルを選べるようには、すでにしてあるのですが、回答していただいたコードとの組ませ方がわからないので、もう一度ご教示していただけませんでしょうか。 <ダイアログボックスを表示して、ファイルを開く(使用コード)> *フォームに、「コマンドボタン」と「コモンダイアログ」を配置しています Private Sub Command1_Click() CommonDialog1.Filter = "テキスト(*.txt)|*.txt|すべて(*.*)|*.*" CommonDialog1.FilterIndex = 1 CommonDialog1.Flags = cdlONFileMustExist '既存ファイルのみ読み込み CommonDialog1.ShowOpen If CommonDialog1.FileName = "" Then Exit Sub myFile = CommonDialog1.FileName FileRead End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
Instr関数を使った、ロジックだけ記します。 (1)1レコードを読む。インプットエリアをaとする。 (2)文字列aの中に「OPEN」と言う語句を探す。 st=1 p=instr(st,a,"open") (3)なければ(1)へ行き次レコードで繰り返す。 (4)あれば、第p(p+4でも良い)字以後に「"」を探す。 st=p+4 p=instr(st,a,char(34)) (5)あるはずだから、p1=pで保存。 p1=p st=p (6)第p1+1字以後に「"」を探す。 st=p1+1 p=instr(st,a,char(34)) あるはず(「”」のペアー性)だから、p2=pで保存。 p2=p (7)s=mid(a,p1+1,p2-p1-1)で目的のファイル名を切りだし。 テキストボックスに表示。 テキストボックスのプロパティMultilineをTrueにすること。 (8)1レコードに2個Openがないものとして(「:」を 使っていないとして)(1)へ行き次レコードで繰り返 す。 (注意点)○Openの大文字小文字対応。頭大文字対応。 ○「:」(マルチステートメント)は使ってないか。 ○ファイル名を括る「"」の次レコード繰越ありか 。 ○p=0見つからなかった時のエラー処理。 ○プログラム・ソースなら80桁以下とかも あるのかな。 以上の点は対応していない。 丁寧にやるなら上記に対応必要あり。
お礼
参考になりました。ありがとうございます。
お礼
ありがとうございます。ダイアログボックスよりファイルを選択した上で、*.*のみ拾えました。が、しかし・・・
補足
ほとんどのテキストファイルが、ダイアログボックスより選択して、読み込んだところで、フリーズしてしまいます。私には何が悪いのかさっぱりわかりません。今の実力では到底無理そうなので、教えていただけませんでしょうか。ちなみに、テキストボックスはリッチテキストボックスを使用しました。 メモ帳にでもコピペしてください ↓ <フリーズしたファイルの一部> 例1、XOPEN.TEXT(1kb) '*-----------------------------------* '* XOPEN S62.11.13 NDC M.HATTORI * '*-----------------------------------* SUB XOPEN(LANG%,FINAME$,XNAME$,FLAG%) STATIC DEFINT A-Z CNT=LEN(XNAME$) : FLAG%=0 : XF$=MID$(XNAME$,1,CNT-1) OPEN XF$ AS #250 LEN=1 FIELD #250,1 AS FLG$ GET #250,1 IF FLG$="0" THEN_ LSET FLG$="1" : FLAG%=0 : PUT #250,1_ ELSE_ FLAG%=5 CLOSE #250 END SUB ―――――――――――――――――――――――――――――――――――――――― 例2、 XCLOSE.TXT(1kb) '*-----------------------------------* '* XCLOSE S62.11.13 NDC M.HATTORI * '*-----------------------------------* SUB XCLOSE(LANG%,XNAME$,FLAG%) STATIC DEFINT A-Z CNT=LEN(XNAME$) : FLAG%=0 : XF$=MID$(XNAME$,1,CNT-1) OPEN XF$ AS #250 LEN=1 FIELD #250,1 AS FLG$ GET #250,1 LSET FLG$="0" PUT #250,1 CLOSE #250 END SUB <逆に普通に読み込めて、結果も出たファイルの一部> 例1、 TEST1.TXT(2kb) '*************************************************************************** '** PROGRAM トラブル対応 * '** 出荷予定データのヌルをブランクに * '** MODULE ID. TEST1 * '** REVISION T.TOKIZAKI * '** CREATE 2001/04/27 * '*************************************************************************** DEFINT A-Z CLS CLEAR ' CALL PCMD(MD$) ' OPEN "BLGCOMON.DAT" AS #1 LEN=32 FIELD #1,1 AS BLG1$,8 AS BLG2$,1 AS BLG3$,20 AS BLGDUM$,2 AS BLGDEV$ GET #1,1 FLFLG=VAL(BLG1$) FLNUM$=BLG2$ KOJO$=BLG3$:DEV$ = BLGDEV$ CLOSE #1 ' SHELL "COPY "+DEV$+"010428B.DAT 010428B.CPY > NUL" ' OPEN DEV$+"010428B.DAT" AS #2 LEN=450 FIELD #2,200 AS A1$,200 AS A2$,50 AS A3$ FOR I = 1 TO LOF(2)/450 GET #2,I IF MID$(A1$,1,6)=CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0) THEN B1$=SPACE$(200) B2$=SPACE$(200) B3$=SPACE$(50) MID$(B3$,7,1)="D" LSET A1$=B1$ LSET A2$=B2$ LSET A3$=B3$ PUT #2,I END IF NEXT I CLOSE END ' MAIN.EXIT: 読み込んだ結果、テキストボックスには BLGCOMON.DAT 010428B.DAT と表示された。 ―――――――――――――――――――――――――――――――――――――――― 例2、 SKSCNTC1.TXT(1kb) OPEN "BLGCOMON.DAT" AS #1 LEN=32 FIELD #1,32 AS BLG$ GET #1,1 DEV$=MID$(BLG$,31,2) CLOSE OPEN "BLGCOMON.DAT" AS #1 LEN=32 FIELD #1,1 AS BLG.FLG$,31 AS BLG.D$ GET #1,3 LSET BLG.FLG$="0" PUT #1,3 CLOSE OPEN DEV$+"BLGCNTL.DAT" AS #1 LEN=3 FIELD #1,3 AS CNT1$ LSET CNT1$="000" PUT #1,1 CLOSE OPEN DEV$+"BLG260CT.DAT" AS #1 LEN=128 FIELD #1,3 AS BG1$,6 AS BG2$,119 AS BGDUM$ IF LOF(1)/128<>0 THEN GET #1,1 ELSE LSET BG2$="" : LSET BGDUM$="" LSET BG1$="000" PUT #1,1 CLOSE SHELL "DEF" CHAIN "SKSMENT" END 読み込んだ結果、テキストボックスには BLGCOMON.DAT BLGCOMON.DAT BLGCNTL.DAT BLG260CT.DAT と表示された。