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