从批处理文件中的TAB分隔符文件中读取值

时间:2017-10-20 04:51:36

标签: batch-file

以下数据文件具有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]

2 个答案:

答案 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。