Batch file 匹配一个输出文件中两个csv源和返回行之间的第一个值

Batch file 匹配一个输出文件中两个csv源和返回行之间的第一个值,batch-file,vbscript,Batch File,Vbscript,有没有办法在分隔的源文件中找到匹配值并输出到CSV?因此,它将搜索源文件中的第一个值,并尝试匹配匹配文件中的第一个值。然后它将输出与输出文件匹配的整行 源文件: 匹配文件: 输出: 了解到文本文件的ADO连接(开始)和SQL连接(开始)。清理您的文本格式(一个字符分隔符(不是多字符(“|”)分隔符、带引号的字符串、一种格式表示全部),并使用文件描述您的文件/表。对于我的示例,我使用了: ; [a.txt] ColNameHeader=False CharacterSet=1252 Format=

有没有办法在分隔的源文件中找到匹配值并输出到CSV?因此,它将搜索源文件中的第一个值,并尝试匹配匹配文件中的第一个值。然后它将输出与输出文件匹配的整行

源文件:

匹配文件:

输出:


了解到文本文件的ADO连接(开始)和SQL连接(开始)。清理您的文本格式(一个字符分隔符(不是多字符(“|”)分隔符、带引号的字符串、一种格式表示全部),并使用文件描述您的文件/表。对于我的示例,我使用了:

;
[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"
在代码中,打开文件所在的文件夹并执行SQL语句,如

SELECT A.* FROM [b.txt] AS B, [a.txt] AS A WHERE B.d = A.d
获得所需的数据;分别

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

要将所选内容放入文件c.txt。

尽管您自己没有展示任何研究成果,但我决定根据我在上文中提到的大多数命令和技术提供解决方案

以下脚本的主要思想是为/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以前,我使用批处理查找源文件中1个值的匹配项,如此处所示。这次我将搜索多个值。批处理或vbscript中的任何解决方案都可以,或者只是将我指向一个类似过程的示例,我将从此处开始。@Randy Schuman all number是唯一的,始终有8个字符。我删除了“vbscript”为了避免混淆(标签已经足够了)。无论如何,请发布您尝试描述的内容,并准确描述问题的症结所在!否则这只是一个任务请求,因为StackOverflow不是一个免费的代码编写服务,所以这里没有这个主题。请在这里学习!
"SELECT A.* INTO [c.txt] FROM [b.txt] AS B, [a.txt] AS A WHERE B.d = A.d"
@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
@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