以下数据文件具有TAB分隔符,如果所有字段值都可用,则其工作正常,如果文件中的任何值为空则不正常。第一行数据正确获取但第二行数据无法正确获取,因为第2和第4字段为空(第1和第3字段之间有2个TAB,第二行有3和5)。请帮助我在代码中进行任何更改。
@echo off
setlocal enabledelayedexpansion
call :find_data
endlocal
pause
exit /b 0
:find_data
setlocal enabledelayedexpansion
for /f "tokens=1,3,5 delims= " %%a in (data.txt) do (
set id=%%a
set name=%%b
set addr=%%c
echo [!id!] [!name!] [!addr!]
)
exit /b 0
endlocal
goto :eof
data.txt
:
11111 C John K USA 22222 Harry USA
输出上述代码:
[11111] [John] [USA] [22222] [USA] []
预期产出:
[11111] [John] [USA] [22222] [Harry] [USA]
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "tab= "
call :find_data
pause
GOTO :eof
:find_data
setlocal enabledelayedexpansion
for /f "delims=" %%T in (%sourcedir%\q46842570.txt) do (
SET "dataline=%%T"
SET "dataline="!dataline:%tab%="#"!""
for /f "tokens=1,3,5 delims=#" %%a in ("!dataline!") do (
set id=%%~a
set name=%%~b
set addr=%%~c
echo [!id!] [!name!] [!addr!]
)
)
endlocal
goto :eof
您需要更改sourcedir
的设置以适合您的具体情况。
我使用了一个名为q46842570.txt
的文件,其中包含我的测试数据。
我设置了一个名为tab
的变量,这样我就不会感到困惑。
问题出现是因为cmd
将连续的分隔符解释为单个分隔符,所以我只是用tab
中的"#"
替换每个dataline
。我发现尝试用tab
替换"tab"
失败了,所以我选择了#
(只需要在文件中另外使用)dataline
进一步包含在兔子中#39; -ears,结果是
" field1的"#" FIELD2"#"字段3"#" field4中"#"字段5"
然后使用#
作为分隔符,并删除metavariables
中出现的字段数据周围的封闭引号(例如)%%~a
。
按照aschipfl的建设性批评,另一个在不更改分隔符的情况下完成此操作的例程是:find_data2
以下:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "tab= "
call :find_data
call :find_data2
pause
GOTO :eof
:find_data
setlocal enabledelayedexpansion
for /f "delims=" %%T in (%sourcedir%\q46842570.txt) do (
SET "dataline=%%T"
SET "dataline="!dataline:%tab%="#"!""
for /f "tokens=1,3,5 delims=#" %%a in ("!dataline!") do (
set id=%%~a
set name=%%~b
set addr=%%~c
echo [!id!] [!name!] [!addr!]
)
)
endlocal
goto :eof
:find_data2
setlocal enabledelayedexpansion
for /f "delims=" %%T in (%sourcedir%\q46842570.txt) do (
SET "dataline=%%T"
for /f "tokens=1,3,5 delims=%tab%" %%a in (""!dataline:^%tab%^="%tab%"!"") do (
set id=%%~a
set name=%%~b
set addr=%%~c
echo [!id!] [!name!] [!addr!]
)
)
endlocal
goto :eof
答案 1 :(得分:1)
此解决方案使用不同的方法:
@echo off
setlocal enabledelayedexpansion
for /F "delims=" %%a in (data.txt) do (
set "data=%%a"
call :find_data
)
pause
exit /b 0
:find_data
set i=1
rem Separate individual tokens based on TAB character
set "token1=%data: =" & set /A i+=1 & set "token!i!=%"
echo [!token1!] [!token3!] [!token5!]
goto :eof
重要:请注意,%data: ="
部分中冒号和等号之间的字符必须是 TAB字符。此char通常由Web浏览器更改为空格,因此您必须删除空格并插入TAB。