2016-09-01 10 views
-1

デリミタ付きソースファイルとCSV出力一致の一致値を見つける方法はありますか?そのため、ソースファイルの最初の値を検索し、マッチファイルの最初の値と一致させます。次に、出力ファイルに一致する行全体を出力します。1つの出力ファイルの2つのcsvソースと戻り行の最初の値を一致させる

ソースファイル:

12341234 |John Wayne |1234 |Halo | 
11111111 |Harambe |421 |Zoo | 
22222222 |Scary S |4569 |Test | 

マッチファイル:

11111111, John H 
22222222, Scary Smithen 

出力:

11111111 |Harambe |421 |Zoo | 
22222222 |Scary S |4569 |Test | 
+0

これは、最初のフィールドで使用されている実際の数値の例ですか、それとも一意の数字で、常に8文字ですか? –

+0

これまでに何を試してみましたか、どの部分に問題がありますか?あなたの努力を共有してください!そして、あなたが望むものを明確にしてください(タイトルにはVBScriptだけがあり、タグはもっと言います)... – aschipfl

+0

@aschipfl以前はバッチ[jgrep.bat](https://gist.github.com/krowe/da2a6b021ac891f8e3be)を使っていましたソースファイルの1つの値と一致するものを見つける[link](http://superuser.com/questions/822405/how-to-search-for-a-certain-keyword-that-match-the-variable-in -バッチファイル)。今回私は複数の価値を検索するつもりです。バッチまたはvbscriptからの解決策は、私がそこから進める同様のプロセスの例を行うか、私に指摘します。 – Baker

答えて

0

hereを開始)テキストファイルにADO接続について学び、SQLは、(hereを開始)参加。あなたのテキストの書式をクリーンアップします(1つの文字の区切り(ないマルチCHAR(「|」)区切り文字、引用符で囲まれた文字列、すべてのための1つのフォーマット)とschema.iniファイルを使用してファイル/テーブルを記述し、私のサンプルでは私が使用:

; 
[a.txt] 
ColNameHeader=False 
CharacterSet=1252 
Format=Delimited(|) 
col1=d LONG 
col2=e TEXT 
col3=f LONG 
col4=g TEXT 

[b.txt] 
ColNameHeader=False 
CharacterSet=1252 
Format=Delimited(|) 
col1=d LONG 
col2=e TEXT 

[c.txt] 
ColNameHeader=False 
CharacterSet=1252 
Format=Delimited(|) 
col1=d LONG 
col2=e TEXT 
col3=f LONG 
col4=g TEXT 
を。

マイA.TXT:あなたのコードで

12341234|"John Wayne"|1234|"Halo" 
11111111|"Harambe"|421|"Zoo" 
22222222|"Scary S"|4569|"Test" 

は、あなたのファイルはトンを得るために

SELECT A.* FROM [b.txt] AS B, [a.txt] AS A WHERE B.d = A.d 

のようなSQL文を中に常駐し、実行フォルダにADODB.CONNECTIONを開きます彼はデータを求めた。 resp。

"SELECT A.* INTO [c.txt] FROM [b.txt] AS B, [a.txt] AS A WHERE B.d = A.d" 

選択をファイルc.txtに入れる。

0

自分で調査したわけではありませんが、上記のcommentで言及したほとんどのコマンドと手法に基づいて、のソリューションを提供することにしました。

次のスクリプトの主なアイデアは、2つの入力ファイルのいずれかを読み込む2つのループをネストすることです(for /F)。外側のループは、ソースファイル(|で区切らテーブル)、内側のCSV一致ファイルを読み取り:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem Define constants here: 
set "SOURCEFILE=%~dp0table.txt" 
set "MATCHFILE=%~dp0match.csv" 
set "TARGETFILE=con" 

> "%TARGETFILE%" (
    for /F "usebackq delims=" %%L in ("%SOURCEFILE%") do (
     for /F "tokens=1 delims=| " %%N in ("%%L") do (
      for /F "usebackq tokens=1 delims=," %%F in ("%MATCHFILE%") do (
       if "%%N"=="%%F" (
        echo %%L 
       ) 
      ) 
     ) 
    ) 
) 

endlocal 
exit /B 

これは非常に単純であるが、大きな欠点がある:ソース・ファイルのすべての単一のラインについて、 CSVファイル全体が読み込まれ、解析されるので、巨大なソースファイルの場合には多くのファイルアクセス操作があります。このアプローチは、読み込み、最初にCSVファイルを解析し、最初の列から値を格納

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem Define constants here: 
set "SOURCEFILE=%~dp0table.txt" 
set "MATCHFILE=%~dp0match.csv" 
set "TARGETFILE=con" 

set /A "MATCHCOUNT=0" 
for /F "usebackq tokens=1 delims=," %%F in ("%MATCHFILE%") do (
    set /A "MATCHCOUNT+=1" 
    call set "MATCHNUM[%%MATCHCOUNT%%]=%%F" 
) 

> "%TARGETFILE%" (
    for /F "usebackq delims=" %%L in ("%SOURCEFILE%") do (
     set "SOURCELINE=%%L" 
     for /F "tokens=1 delims=| " %%N in ("%%L") do (
      set "SOURCENUM=%%N" 
      setlocal EnableDelayedExpansion 
      for /L %%I in (1,1,%MATCHCOUNT%) do (
       if "!SOURCENUM!"=="!MATCHNUM[%%I]!" (
        echo !SOURCELINE! 
       ) 
      ) 
      endlocal 
     ) 
    ) 
) 

endlocal 
exit /B 

:それを避けるために

は、CSVファイルは、一度、ソースファイルを処理する前にメモリに読み込まれる必要があります配列のような環境変数MATCHNUM[]に変換し、ソースファイルの検索に使用します。

関連する問題