0

テキスト ファイルを 1 行ずつ処理する do-while ループがあります。テキスト ファイルにはパス名とファイル名 (C:\Folder\file1.txt) が含まれています。

行に特定の文字列が含まれている場合、ファイルをその場所にコピーし、テキスト ファイルで指定されている名前に名前を変更してから、コピーしたファイル内の文字列を置き換えます。
そうでない場合は、次の行に進みます。

これはかなり簡単だと思いましたが、うまくいかないようです。ループの構文が間違っているというエラーが表示されるため、現在コンパイルすることさえできません。

関数のコード全体を次に示します。

Private Sub Command2_Click()

    Dim LineData As String 
    Dim FileHandle As Integer

    FileHandle = FreeFile
    Open "C:\textfile.txt" For Input As #FileHandle

    Do While Not EOF(FileHandle)
        Line Input #FileHandle, LineData
        If InStr(LineData, ".log") Then
            FileCopy "C:\thefile.log",LineData
            Open LineData For Input As #3
             #3 = Replace$(#3, "abc", "xyz")
        Else
        End If  
    Loop
    
    Close #FileHandle
    Close #3

    MsgBox "Copy, Replace, Complete!"

End Sub

前もって感謝します!

4

4 に答える 4

1

私は信じません

#3 = Replace$(#3, "abc", "xyz")

有効です。そのファイルの内容を1行ずつ(または一度にいくつかの適切なチャンクで)読み取り、置換を行ってから、新しいファイルに書き戻す必要があります。とにかくファイルをコピーしているので、ソースの場所からファイルを読み取り、ファイルがコピーされた場所に新しいバージョンを書き込むことをお勧めします。

例えば...

Private Sub Command2_Click()
 Dim LineData As String
 Dim FileHandle As Integer
 Dim sourceHandle as Integer
 Dim destHandle as Integer
 dim temp as string
 FileHandle = FreeFile
 Open "C:\textfile.txt" For Input As #FileHandle
 Do While Not EOF(FileHandle)
  Line Input #FileHandle, LineData
  If InStr(LineData, ".log") Then
   sourceHandle=FreeFile
   Open "C:\thefile.log" For Input as #sourceHandle
   destHandle=FreeFile
   Open LineData For Output as #destHandle
   Do while Not EOF(sourceHandle)
    Line Input #sourceHandle,temp
    temp=replace$(temp,"abc","xyz")
    Print #destHandle,temp
   Loop
   Close #destHandle
   Close #sourceHandle
  End If
 Loop
Close #FileHandle
MsgBox "Copy, Replace, Complete!"
End Sub

エラーが発生した場合は申し訳ありませんが、このコンピューターにVB IDEがインストールされていないため、これはテストされていません。

于 2008-11-15T22:07:35.900 に答える
1

#3 = Replace $ ...はあなたの問題行です...それと他のものを修正すると、次のようになります:

Private Sub Command2_Click()
  Dim LineData As String
  Dim FileHandle As Integer
  Dim Buffer As String
  FileHandle = FreeFile
  Open "C:\thefile.log" For Binary Access Read As #FileHandle
  Buffer = Space(LOF(FileHandle))
  Get #FileHandle, , Buffer
  Buffer = Replace(Buffer, "abc", "xyz")
  Close #FileHandle
  FileHandle = FreeFile
  Open "C:\textfile.txt" For Input As #FileHandle
  Do Until EOF(FileHandle)
    Line Input #FileHandle, LineData
    If InStr(LineData, ".log") Then
      Open LineData For Output As #3
      Print #3, Buffer;
      Close #3
    End If
  Loop
  Close #FileHandle
  MsgBox "Copy, Replace, Complete!"
End Sub

ミニマリズムと短いコードを好む場合は、代わりにこれを使用できます。

Private Sub Command2_Click()
  ''// This code requires a reference to Microsoft Scripting runtime (Project -> References)
  Dim FSO As New Scripting.FileSystemObject
  Dim Files() As String
  Dim File As String
  Dim Data As String
  Data = Replace(FSO.OpenTextFile("C:\thefile.log").ReadAll(), "abc", "xyz")
  Files = Split(FSO.OpenTextFile("C:\textfile.txt").ReadAll(), vbCrLf)
  For Each File In Files
    If InStr(File, ".log") > 0 Then FSO.CreateTextFile(File, True).Write Data
  Next
  MsgBox "Copy, Replace, Complete!"
End Sub
于 2008-11-16T12:04:30.860 に答える
0

別のアプローチを提案したいと思います。私は、コピーを作成していることを事前に知っていたことを除いて、このようなことをしました。私の方法は、ソースと新しいターゲット (コピー) を開くことでした。次に、ソース ファイルを 1 行ずつ読み取り、コピーに書き戻す前に、その行を読み取った変数に必要な変更を加えます。私のファイルは数kを超えることはありませんでしたが、これは十分に高速で、ループの1つを排除しました. ループ内に変数を配置して、一度ファイルの名前を変更するか、探している行が見つからずコピーが必要ない場合はファイルを削除する必要があります。

于 2009-10-05T16:36:43.427 に答える
0

私が見た問題の 1 つは、ファイルハンドルを開いてから #3 を開いているが、同じ順序でそれらを閉じており、#3 を閉じてからファイルハンドルを閉じる必要があることです。

私が見ているのは、ファイルハンドルが開かれ、「.log」を含む行が検索され、何かが実行されるということです。これまでのところ、とてもうまくいっています。ただし、#3 を開き、別の処理を行った後、ループします。処理が完了したら、#3 を閉じる必要があります。

"Close #3" を 4 行 ("#3 = Replace..." の後の次のステートメントに) 移動すると、期待どおりに動作し、正常にコンパイルされるはずです。

于 2008-11-15T22:00:36.537 に答える