2012-10-31 5 views
5

行ごとにテキストを読み取るようにvbscriptを作成する際に問題があります。 これは、コードが何をすべきステップである:行ごとにtxtファイルを読み取る

  1. 読み取り
  2. オープンfolder.txtに記載されているファイルをfolder.txt
  3. エコーtest.txtの
  4. 読むフォルダリストの内側に内容。 TXT
  5. オープンライン
でフォルダ-list.txtに
  • オープンdirlist.txtとエコーラインに記載されているファイル

    folder.txtが含まれているものの例:

    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\test.txt 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[12CUT] _____ (Gakkou no Kaidan) [518382]\test.txt 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[2____] _____!__CD__________ [521206]\test.txt 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[Ability] _____________________ [514182]\test.txt 
    

    どのフォルダ-list.txtにの例には以下が含まれます。

    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\dirlist.txt 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[12CUT] _____ (Gakkou no Kaidan) [518382]\dirlist.txt 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[2____] _____!__CD__________ [521206]\dirlist.txt 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[Ability] _____________________ [514182]\dirlist.txt 
    

    各dirlist.txtが

    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\00.jpg 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_01.jpg 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_02.jpg 
    C:\Documents and Settings\Administrator\Desktop\ArtistCG\[ Go! Go! Heaven!!]_____________25 -______ ___- [525067]\a_03.jpg 
    
    が含まれているものの例

    これはvbscriptコード

    Option Explicit 
    
    Dim objFSO, strTextFile, strData, strLine, arrLines, aniTextFile, aniData, aniLines, meLine, objTextFile, fso, inputFileList, sFolderName, fname 
    Dim iim1, iret, iret2, iret3, i 
    CONST ForReading = 1 
    
    strTextFile = "C:\Documents and Settings\Administrator\Desktop\ArtistCG\folder.txt" 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    strData = objFSO.OpenTextFile(strTextFile,ForReading).ReadAll 
    arrLines = Split(strData,vbCrLf) 
    
    For Each strLine in arrLines 
        strData = objFSO.OpenTextFile(strLine,ForReading).ReadAll 
    WScript.Echo strData 
    
    aniTextFile = "C:\Documents and Settings\Administrator\Desktop\ArtistCG\folder-list.txt" 
    
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    aniData = objFSO.OpenTextFile(aniTextFile,ForReading).ReadAll 
    aniLines = Split(aniData,vbCrLf) 
    
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set listFile = fso.OpenTextFile(aniLines).ReadAll 
    do while not listFile.AtEndOfStream 
        fName = listFile.ReadLine() 
        WScript.Echo fName 
        Loop 
    Next 
    

    これまでのところ、1から4までの手順しかありませんでしたが、dirlist.txtを読むことができません。ここに解決策はありますか?

  • 答えて

    15

    Set listFile = fso.OpenTextFile(aniLines).ReadAll 
    

    は、2つの理由で動作しません:変数にオブジェクトを割り当てるとき

    • Setにのみ使用することができるが、ReadAllストリングを返します。
    • OpenTextFile()は文字列が必要ですが、aniLinesの配列の文字列です。

    は、配列のすべての要素を処理するには、このようなものを使用することができます

    For Each line In aniLines 
        ' read dirlist.txt file 
    Next 
    

    質問は、あなたがdirlist.txtファイルを読みたい方法です。あなたが他のファイルと同じように同じことを行うことができます。ファイルの内容全体を読み込み、配列に分割:

    listFile = fso.OpenTextFile(line).ReadAll 
    listLines = Split(listFile, vbCrLf) 
    

    と、配列のフィールドを処理するために、上記のような別のループを使用しますlistLines。このアプローチは、コードがより簡単であるため、小さなファイルの方が適しています。

    それとも、(あなたが大きなファイルを処理する必要がある場合には、メモリの枯渇を避けるため、preferrableです)ReadLineアプローチを使用できます。

    Set listFile = fso.OpenTextFile(line) ' <-- remove .ReadAll from this line! 
    Do Until listFile.AtEndOfStream 
        fName = listFile.ReadLine 
        ' do stuff with fName 
    Loop 
    

    をセマンティックがあるので、私は、Do Until代わりのDo While Notを使用することをお勧めします前者は自然言語に近いので読みやすくなります。

    また、スクリプトの最初にFileSystemObjectオブジェクトをインスタンス化して、残りのスクリプトでそのインスタンスを使用するだけで十分です。何度も繰り返しインスタンス化するのは無意味です。

    +2

    +1ですが、 'ReadLine'を使うのは、' ReadAll'と 'Split'comboの方がはるかに意味があるからです。 –

    関連する問題