0

まず第一に、私はプログラミングのバックグラウンドではなく、VBscript はまったくの初心者です。何らかの理由で、オフィスでこのスクリプト作成タスクを実行する必要があります。Quick Test Professional 11 で使用したい。

ここでも他のフォーラムでも多くの投稿を確認しましたが、必要な情報を見つけることができませんでした。

わかりましたので、ここで私がする必要があることは次のとおりです。

2 つのテキスト ファイルを比較し、違いを 3 番目のファイルに書き込む必要があります。両方のファイルには、日付、注文番号など、いくつかのフィールドからのほぼ同じ内容が含まれています。

たとえば、ファイル 1 には日付: 00/11/1234 および注文番号: 1111 があり、ファイル 2 には日付: 11/00/6789 および注文番号: 2222 があるため、これらのフィールドとその値を無視できる方法はありますか? ? 追加でき、比較中に使用され、比較中にフィールドをスキップする無視リストを作成する方法はありますか? したがって、これらの値は常に異なるため、私の差分ファイルにはこれらの違いはありません。そのため、結果ファイルで他のすべての違いを取得できます。

参考までに、サンプルファイルを以下に示します。

これまでのところ、両方のファイルを比較しましたが、最も簡単な方法で、フィールドを無視する方法がわかりません。関数ライブラリで使用できるように、これらのタスクを関数として作成したいと考えています。

ファイル-1

日付: 00/11/1234 / 注文番号: 1111

価格 1: $1111.00

価格 2: $2222.00

価格 3: $1234.00

ABC def GHI kjl 1111

注文番号:1111

期間: 2年

日付: 1234 年 11 月 00 日

ファイル-2

日付: 11/00/6789 注文番号: 2222

価格 1: $1111.00

価格 2: $2222.00

価格 3: $5678.00

ABC def GHI kjl 1111

注文番号:2222

期間: 3年

日付: 11/00/6789

結果ファイルは次のように表示されます。

違い:

ファイル 1 行 4: 価格 3: $1234.00

ファイル 2 行 4: 価格 3: $5678.00

ファイル-1 行 7: 期間: 2 年

ファイル 2 行 7: 期間: 3 年

事前にどうもありがとうございました。

こんにちは @Ekkehard.Horner あなたの助けと時間、そして私のばかげた質問に寛容してくれてありがとう。実際のところ、あなたのコードを理解しようとすればするほど、私は混乱していきました。以下のコードを Quick Test Pro_11 に入れると、構文エラー @ "Dim oDiffer : Set oDiffer = New cDiffer.init("C:......" QTP is said "Expected End of STatement" between " ... 新しい cDiffer" および ".init" QTP は、関数 "TrailVersion" と関数 "GoldVersion" の両方でエラーを示しました

これに光を当てることができれば、それは素晴らしいことです。そして、「期待される」テキストファイルが必要ですか...? そうしないと、すべての比較のために「期待される」ファイルを作成する必要があるため、その部分を含めたくありません。

ばかげた質問をお許しください。

前もって感謝します。

Class cDiffer   
Option Explicit  
Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")  
    WScript.Quit TrialVersion() 
    WScript.Quit TinVersion()  
Function TinVersion()   
    WScript.Echo "can't compare files yet."   
    TinVersion = 1 
End Function ' TinVersion  
HERE I'VE COMMENTED TRIALVERSION FUNCTION 
Function TrialVersion()   
Dim oDiffer : Set oDiffer = New cDiffer.init("C:\Documents and Settings\24800\My Documents\PDF comparison\A_30120625003267.TXT", "C:\Documents and Settings\aa24800\My Documents\PDFcomparison\B_30120502002776.TXT", Array("Quote ID:", "Quote Summary for:", "Quote Date:", "Tracking ID (A):", "Tracking ID (Z):", "Tracking ID:")
    ' the differ should be able to return a result - the differences   
    Dim sRes : sRes = oDiffer.diffs()   
    ' check actual vs. expected result   
    Dim sExp : sExp = goFS.OpenTextFile("Expected").ReadAll()  
    WScript.Echo "--------- Res"   
    WScript.Echo sRes   
    If sExp = sRes Then      
        WScript.Echo "ok"      
        ' save result      
        goFS.CreateTextFile("C:\Documents and Settings\aa24800\My Documents\PDF comparison\Result.TXT", True).Write sRes      
        TrialVersion = 0   Else      
        ' show failure      
        WScript.Echo "--------- Exp"      
        WScript.Echo sExp      
        WScript.Echo "not ok"      
        TrialVersion = 1   
    End If 
End Function ' TrialVersion  
'trivial Differ 
'Class cDiffer   
    Dim m_sLFSpec : m_sLFSpec = "C:\Documents and Settings\aa24800\My Documents\PDF comparison\A_30120625003267.TXT"
Dim m_sRFSpec : m_sRFSpec = "C:\Documents and Settings\aa24800\My Documents\PDF comparison\B_30120502002776.TXT"   
    ' "constructor" with params   
    Public Function init(sLFSpec, sRFSpec)     
        Set init  = Me     
        m_sLFSpec = sLFSpec     
        m_sRFSpec = sRFSpec   
    End Function   
    Public Function diffs()     
        diffs = "cDiffer.diffs() not implemented yet."   
    End Function ' diffs 
'End Class ' cDiffer00
'gold Differ 
'Class cDiffer   
'   Private m_sLFSpec   ' file specs   
'   Private m_sRFSpec   
    Private m_sLFiNa    ' file names   
    Private m_sRFiNa   
    Private m_dicLabels ' store and efficiently find selective labels   
    ' "constructor" with params   
    Public Function init(sLFSpec, sRFSpec, aLabels)     
        Set init  = Me     
        m_sLFSpec = sLFSpec     
        m_sRFSpec = sRFSpec     
        m_sLFiNa  = goFS.GetBaseName(sLFSpec)     
        m_sRFiNa  = goFS.GetBaseName(sRFSpec)     
        Set m_dicLabels = CreateObject("Scripting.Dictionary")     
        m_dicLabels.CompareMode = vbTextCompare ' case-insensitive     
        Dim sKey     
        For Each sKey In aLabels         
            m_dicLabels(sKey) = 0     
        Next   
    End Function   
    Public Function diffs()     ' Use ArrayList to collect the results     
        Dim alRes : Set alRes = CreateObject("System.Collections.ArrayList")     
        ' requested title     
        alRes.Add "Differences:"     
        ' open both input files     
        Dim tsL   : Set tsL   = goFS.OpenTextFile(m_sLFSpec)     
        Dim tsR   : Set tsR   = goFS.OpenTextFile(m_sRFSpec)     
        ' loop over lines     
        Do Until tsL.AtEndOfStream        
            Dim sLL : sLL = tsL.ReadLine()        
            Dim sRL        
            ' second file could be shorter        
            If tsR.AtEndOfStream Then           
                alRes.Add "tsR.AtEndOfStream"           
        Exit Do        
            Else           
                sRL = tsR.ReadLine()        
            End If        
            ' no need for work if lines are equal        
            If sLL <> sRL Then           
                If m_dicLabels.Exists(Split(sLL, ":")(0))Then                  
                Dim sLiNo : sLiNo = CStr(tsL.Line - 1)& ":"              
            alRes.Add Join(Array(m_sLFiNa, "Line", sLiNo, sLL))              
            alRes.Add Join(Array(m_sRFiNa, "Line", sLiNo, sRL))           
            End If        
        End If     
    Loop     
    tsL.Close     
    tsR.Close     
    diffs = Join(alRes.ToArray(), vbCrLf) & vbCrLf   
End Function ' diffs 
End Class ' cDiffer

Function GoldVersion()   
   ' the differ should know about the files to compare   
   ' and the info labels to select   
   Dim oDiffer : Set oDiffer = New cDiffer.init("C:\Documents and Settings\aa24800\My Documents\PDF comparison\A_30120625003267.TXT", "C:\Documents and Settings\aa24800\My Documents\PDF comparison\B_30120502002776.TXT", Array("Quote ID:", "Quote Summary for:", "Quote Date:", "Tracking ID (A):", "Tracking ID (Z):", "Tracking ID:")
   ' the differ should be able to return a result - the differences    
   Dim sRes : sRes = oDiffer.diffs()   
   ' check actual vs. expected result   
   Dim sExp : sExp = goFS.OpenTextFile("Expected").ReadAll()   
   WScript.Echo "--------- Res"   
   WScript.Echo sRes   
    If sExp = sRes Then      
       WScript.Echo "ok"      
       ' save result      
       goFS.CreateTextFile("C:\Documents and Settings\aa24800\My Documents\PDF comparison\Result.TXT", True).Write sRes      
       GoldVersion = 0   Else      
       ' show failure      
       WScript.Echo "--------- Exp"      
       WScript.Echo sExp      
       WScript.Echo "not ok"      
       GoldVersion = 1   
    End If 
End Function ' GoldVersion
4

1 に答える 1

1

VBScript を初めて使用する場合は、次の問題に役立つ方法で現在の問題に取り組むことで利益が得られる場合があります。

SelFileComp.vbs を配置することから始めます。

'' SelFileComp.vbs - selective file compare

Option Explicit

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")

WScript.Quit TinVersion()

Function TinVersion()
  WScript.Echo "can't compare files yet."
  TinVersion = 1
End Function ' TinVersion

適切なディレクトリに。入力ファイルと予想される結果ファイルを追加します。SelFileComp.vbs を開始します。

cscript SelFileComp.vbs
can't compare files yet.
echo %ErrorLevel%
1

(自明な) Differ オブジェクトを準備して使用する TrialVersion を追加 (および呼び出し) して、実装の健全性チェックに適したスケルトンで重労働を行います。

'' SelFileComp.vbs - selective file compare

Option Explicit

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")

WScript.Quit TrialVersion()
WScript.Quit TinVersion()

Function TinVersion()
  WScript.Echo "can't compare files yet."
  TinVersion = 1
End Function ' TinVersion

Function TrialVersion()
  ' the differ should know about the files to compare
  ' we'll worry about the selection later
  Dim oDiffer : Set oDiffer = New cDiffer.init( _
     "File-1", "File-2" _
  )
  ' the differ should be able to return a result - the differences
  Dim sRes : sRes = oDiffer.diffs()
  ' check actual vs. expected result
  Dim sExp : sExp = goFS.OpenTextFile("Expected").ReadAll()
  WScript.Echo "--------- Res"
  WScript.Echo sRes
  If sExp = sRes Then
     WScript.Echo "ok"
     ' save result
     goFS.CreateTextFile("..\data\Result", True).Write sRes
     TrialVersion = 0
  Else
     ' show failure
     WScript.Echo "--------- Exp"
     WScript.Echo sExp
     WScript.Echo "not ok"
     TrialVersion = 1
  End If
End Function ' TrialVersion

' trivial Differ
Class cDiffer
  Private m_sLFSpec
  Private m_sRFSpec
  ' "constructor" with params
  Public Function init(sLFSpec, sRFSpec)
    Set init  = Me
    m_sLFSpec = sLFSpec
    m_sRFSpec = sRFSpec
  End Function
  Public Function diffs()
    diffs = "cDiffer.diffs() not implemented yet."
  End Function ' diffs
End Class ' cDiffer00

出力:

cscript SelFileComp.vbs
--------- Res
cDiffer.diffs() not implemented yet.
--------- Exp
Differences:
File-1 Line 4: Price 3: $1234.00
File-2 Line 4: Price 3: $5678.00
File-1 Line 7: Term: 2-Year
File-2 Line 7: Term: 3-Year

not ok

echo %ErrorLevel%
1

次に、簡単なcDifferの名前を変更すると

' trivial Differ
Class cDiffer00

名前 (および TrialVersion() のコード) を再利用して、少なくともいくつかの比較を行う cDiffer を作成できます。

' simple Differ
Class cDiffer
  Private m_sLFSpec
  Private m_sRFSpec
  ' "constructor" with params
  Public Function init(sLFSpec, sRFSpec)
    Set init  = Me
    m_sLFSpec = sLFSpec
    m_sRFSpec = sRFSpec
  End Function
  Public Function diffs()
    ' Use ArrayList to collect the results
    Dim alRes : Set alRes = CreateObject("System.Collections.ArrayList")
    ' requested title
    alRes.Add "Differences:"
    ' open both input files
    Dim tsL   : Set tsL   = goFS.OpenTextFile(m_sLFSpec)
    Dim tsR   : Set tsR   = goFS.OpenTextFile(m_sRFSpec)
    ' loop over lines
    Do Until tsL.AtEndOfStream
       Dim sLL : sLL = tsL.ReadLine()
       Dim sRL
       ' second file could be shorter
       If tsR.AtEndOfStream Then
          alRes.Add "tsR.AtEndOfStream"
          Exit Do
       Else
          sRL = tsR.ReadLine()
       End If
       ' no need for work if lines are equal
       If sLL <> sRL Then
          alRes.Add "??? " & sLL
          alRes.Add "??? " & sRL
       End If
    Loop
    tsL.Close
    tsR.Close
    diffs = Join(alRes.ToArray(), vbCrLf)
  End Function ' diffs
End Class ' cDiffer00

出力:

cscript SelFileComp.vbs
--------- Res
Differences:
??? Date: 00/11/1234 / Order no: 1111
??? Date: 11/00/6789 and Order no: 2222
??? Price 3: $1234.00
??? Price 3: $5678.00
??? Order no: 1111
??? Order no: 2222
??? Term: 2-Year
??? Term: 3-Year
??? Date: 00/11/1234
??? Date: 11/00/6789
--------- Exp
Differences:
File-1 Line 4: Price 3: $1234.00
File-2 Line 4: Price 3: $5678.00
File-1 Line 7: Term: 2-Year
File-2 Line 7: Term: 3-Year

not ok

これは、どのサブタスクがまだ実行されていないかを明確に示しています。

  1. 関連する差異の選択
  2. 出力フォーマット

楽観的になり、GoldVersion() を追加して呼び出しましょう

Function GoldVersion()
  ' the differ should know about the files to compare
  ' and the info labels to select
  Dim oDiffer : Set oDiffer = New cDiffer.init( _
      "File-1", "File-2" _
    , Array("Price 3", "Term") _
  )
  ' the differ should be able to return a result - the differences
  Dim sRes : sRes = oDiffer.diffs()
  ' check actual vs. expected result
  Dim sExp : sExp = goFS.OpenTextFile("Expected").ReadAll()
  WScript.Echo "--------- Res"
  WScript.Echo sRes
  If sExp = sRes Then
     WScript.Echo "ok"
     ' save result
     goFS.CreateTextFile("..\data\Result", True).Write sRes
     GoldVersion = 0
  Else
     ' show failure
     WScript.Echo "--------- Exp"
     WScript.Echo sExp
     WScript.Echo "not ok"
     GoldVersion = 1
  End If
End Function ' GoldVersion

より良い cDiffer を使用:

' gold Differ
Class cDiffer
  Private m_sLFSpec   ' file specs
  Private m_sRFSpec
  Private m_sLFiNa    ' file names
  Private m_sRFiNa
  Private m_dicLabels ' store and efficiently find selective labels
  ' "constructor" with params
  Public Function init(sLFSpec, sRFSpec, aLabels)
    Set init  = Me
    m_sLFSpec = sLFSpec
    m_sRFSpec = sRFSpec
    m_sLFiNa  = goFS.GetBaseName(sLFSpec)
    m_sRFiNa  = goFS.GetBaseName(sRFSpec)
    Set m_dicLabels = CreateObject("Scripting.Dictionary")
    m_dicLabels.CompareMode = vbTextCompare ' case-insensitive
    Dim sKey
    For Each sKey In aLabels
        m_dicLabels(sKey) = 0
    Next
  End Function
  Public Function diffs()
    ' Use ArrayList to collect the results
    Dim alRes : Set alRes = CreateObject("System.Collections.ArrayList")
    ' requested title
    alRes.Add "Differences:"
    ' open both input files
    Dim tsL   : Set tsL   = goFS.OpenTextFile(m_sLFSpec)
    Dim tsR   : Set tsR   = goFS.OpenTextFile(m_sRFSpec)
    ' loop over lines
    Do Until tsL.AtEndOfStream
       Dim sLL : sLL = tsL.ReadLine()
       Dim sRL
       ' second file could be shorter
       If tsR.AtEndOfStream Then
          alRes.Add "tsR.AtEndOfStream"
          Exit Do
       Else
          sRL = tsR.ReadLine()
       End If
       ' no need for work if lines are equal
       If sLL <> sRL Then
          If m_dicLabels.Exists(Split(sLL, ":")(0)) Then
             alRes.Add Join(Array(m_sLFiNa, "Line", sLL))
             alRes.Add Join(Array(m_sRFiNa, "Line", sRL))
          End If
       End If
    Loop
    tsL.Close
    tsR.Close
    diffs = Join(alRes.ToArray(), vbCrLf)
  End Function ' diffs
End Class ' cDiffer

出力:

cscript SelFileComp.vbs
--------- Res
Differences:
File-1 Line Price 3: $1234.00
File-2 Line Price 3: $5678.00
File-1 Line Term: 2-Year
File-2 Line Term: 3-Year
--------- Exp
Differences:
File-1 Line 4: Price 3: $1234.00
File-2 Line 4: Price 3: $5678.00
File-1 Line 7: Term: 2-Year
File-2 Line 7: Term: 3-Year

not ok

選択は完了しましたが、フォーマットはまだうまくいきません。出力を改善するには:

       If sLL <> sRL Then
          If m_dicLabels.Exists(Split(sLL, ":")(0)) Then
'            alRes.Add Join(Array(m_sLFiNa, "Line", sLL))
'            alRes.Add Join(Array(m_sRFiNa, "Line", sRL))
             Dim sLiNo : sLiNo = CStr(tsL.Line - 1) & ":"
             alRes.Add Join(Array(m_sLFiNa, "Line", sLiNo, sLL))
             alRes.Add Join(Array(m_sRFiNa, "Line", sLiNo, sRL))
          End If
       End If

末尾の vbCrLf を追加するには:

'   diffs = Join(alRes.ToArray(), vbCrLf)
    diffs = Join(alRes.ToArray(), vbCrLf) & vbCrLf

最終出力:

cscript SelFileComp.vbs
--------- Res
Differences:
File-1 Line 4: Price 3: $1234.00
File-2 Line 4: Price 3: $5678.00
File-1 Line 7: Term: 2-Year
File-2 Line 7: Term: 3-Year

ok

echo %ErrorLevel%
0

次の問題お願いします!

更新 A (wrt ファイル仕様/ファイル名)

File-1 を ..\data\ に移動/コピー、変更

  Dim oDiffer : Set oDiffer = New cDiffer.init( _
      "File-1", "File-2" _
    , Array("Price 3", "Term") _
  )

  Dim oDiffer : Set oDiffer = New cDiffer.init( _
      "..\data\File-1", "File-2" _
    , Array("Price 3", "Term") _
  )

cDiffer が使用するため、結果は同じになります。

m_sLFSpec = sLFSpec
  to store the (full) path
m_sLFiNa  = goFS.GetBaseName(sLFSpec)
  to extract the file name for output formatting
Dim tsL   : Set tsL   = goFS.OpenTextFile(m_sLFSpec)
  to open the file

更新 B (辞書を書く)

ディクショナリは、一意のキーの下に要素を格納するコレクションです (配列とは対照的に、数値を介して項目にアクセスできます)。ディクショナリのキーとして検索するラベルを使用することにより、diffs() 関数は、行の最初の部分から .

  Split(sLL, ":")(0)

辞書に載っています

  If m_dicLabels.Exists(Split(sLL, ":")(0)) Then

C の更新 (wrt クラス/コンストラクター)

クラスは、(類似した) オブジェクトの定義/仕様であり、データ (メンバー) と機能 (メソッド) を保持/結合する変数です。cDiffer は、比較するファイルと検索するラベル (m_sLSpec のようなメンバー変数) についてすべて「認識」し、比較 (diffs() のようなメソッド/関数) を「実行」できるオブジェクトを定義するクラスです。New ステートメントは、仕様に従ってオブジェクトを構築/作成するために使用されます。

  Dim oDiffer : Set oDiffer = New cDiffer

New によって作成されたオブジェクトは Empty であり、実際には役に立ちません。Class_Initialize() Sub (Class ... End Class ブロック内) を実装できますが、そのコードはクラスのすべてのオブジェクトに使用されるため、ゲインはわずかです。

Classステートメントのドキュメントの例を見ると、パラメーターのない「コンストラクター」(Class_Initialize) は、行/時間で支払われないプログラマーにはほとんど役に立たないことがわかります。定型コード

   Private Sub Class_Initialize
      m_CustomerName = ""
      m_OrderCount = 0
      ... ad nauseam: set all other member data to 'nix'
   End Sub

VBScriptのため、特に嫌です

  • New を呼び出すとすぐに、空の Class_Initialize に相当するものを自動的に実行します
  • すべての変数を自動的に空に初期化し、空は
    文字列と数値に対して正常に機能します

解決策は、Class_Initialize を忘れて (特別な場合を除いて)、1 つ以上の作業に労力を費やすことです。

  Public Function initXXX(p1, p2, ... pn)
    Set initXXX = Me  ' return VBScript's this to caller
    ... use p1 ... pn to initialize member data to useful values
  End Function
于 2012-09-06T17:55:11.623 に答える