自分で調査したわけではありませんが、上記のcommentで言及したほとんどのコマンドと手法に基づいて、batch-fileのソリューションを提供することにしました。
次のスクリプトの主なアイデアは、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[]
に変換し、ソースファイルの検索に使用します。
これは、最初のフィールドで使用されている実際の数値の例ですか、それとも一意の数字で、常に8文字ですか? –
これまでに何を試してみましたか、どの部分に問題がありますか?あなたの努力を共有してください!そして、あなたが望むものを明確にしてください(タイトルにはVBScriptだけがあり、タグはもっと言います)... – aschipfl
@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