我有一个以下格式的文件。每行是由|分隔的三个值的记录。我编写了一个批处理脚本来验证每行是否有3条记录,并报告是否有任何不良记录(少于或多于3个值)
VALUE11 | VALUE12 | VALUE13 |
VALUE21 | VALUE22 | VALUE23 |
VALUE31 | VALUE32 | VALUE33 |
PSUEDO代码:
对于文件中的每一行,DO
(1)读取变量的行
(2)写入临时文件并获取文件长度
(3)删除|从线
(4)将此修改后的行写入临时文件并获取文件长度
(5)两个计算长度之间的差异给出了值计数
代码:
@echo off
setlocal EnableDelayedExpansion
set /A column_count=3
set file_name=%1
for /f "delims=" %%m in (!file_name!) do (
set current_line=%%m
echo.!current_line!>temp_file
:: Get length
for %%s in (temp_file) do set /a curr_line_length=%%~zs
:: Remove |
set "current_line_withoutpipes=!current_line:|=!"
echo.!current_line_withoutpipes!>temp_file
:: Get new length
for %%s in (temp_file) do set /a current_line_withoutpipes_length=%%~zs
:: Diff gives the pipe count
set /A line_column_count=!curr_line_length!-!current_line_withoutpipes_length!
if !column_count! EQU !line_column_count! (
echo Good record
) else (
echo bad record
)
)
endlocal
问题: 有问题的时候来了!在文件中设置了DelayedExpansion。两个人之间的人物!当它们被设置为变量时会被截断。为了解决这个问题,我把endlocal然后再设置DelayedExpansion。有了这个改变,问题就出现了!已解决,但在" endlocal"之前定义的变量在" endlocal"之后不再可用言。
更改代码:
.
.
for /f "delims=" %%m in (!file_name!) do (
endlocal & set current_line=%%m
setlocal EnableDelayedExpansion
echo.!current_line!>temp_file
.
.
感谢有人可以提供帮助!! 注意:实际文件包含数百条记录。
答案 0 :(得分:1)
您可以在开头使用setlocal
代替endlocal
。
for /f "delims=" %%m in (!file_name!) do (
setlocal DisableDelayedExpansion
set "current_line=%%m"
setlocal EnableDelayedExpansion
echo(!current_line!>temp_file
...
endlocal
endlocal
)
但是当一行以;
开头并且空行也被删除时,即使这种情况也会失败。
要获得完整的解决方案,请阅读Batch files: How to read a file?