У меня есть файл следующего формата. Каждая строка представляет собой запись трех значений, разделенных символом |. Я написал пакетный скрипт, чтобы проверить, есть ли в каждой строке 3 записи, и сообщить, есть ли какие-либо плохие записи (меньше или больше 3 значений).
VALUE11|VALUE12|VALUE13|
VALUE21|VALUE22|VALUE23|
VALUE31|VALUE32|VALUE33|
ПСЕВДО-КОД:
Для каждой строки в файле DO
(1) Прочитать строку в переменную.
(2) Записать во временный файл и получить длину файла.
(3) Удалить | из строки.
(4) Запишите эту измененную строку во временный файл и получите длину файла.
(5) Разница между двумя вычисленными длинами дает значение count
Код:
@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
.
.
Оцените, если кто-то может помочь! ПРИМЕЧАНИЕ. Фактический файл содержит сотни записей.