主要有C31这种行,不然直接 tokens=6, delims=空格就行了。
为了照顾这行的话,就只好按列宽把他们取出来自己拆分,然后判断上一次的DNI是否是[DNI],
是的话这段也截取出来。
另外,文本处理的话,还是建议不要用批处理了,同样的思路,代码量多,还有很多字符的限制,处理起来浪费时间,解决自己的问题,允许机器上装别的语言工具的话,
建议ruby,pyhon。有要求不能装其他的语言解释器的话,也建议使用VBS或JS,而不是批处理。
批处理的话,如下,如果使用ruby,估计也就20行左右(1/4的代码量,而且可读性还高)。- @echo off&setlocal enabledelayedexpansion
-
- set n=2
- for /f "tokens=1,2,3,4,5,6 delims= " %%a in (src.txt) do (
- set /a n+=1
- if not "x%%f"=="x" ( if "x%%b"=="x===" (
- call :headline "%%a" "%%b" "%%c" "%%d" "%%e" "%%f"
- goto :end_head
- ))
- )
-
- :end_head
- echo COLUMN_LEN:%id_len%, %type_len%, %num_len%, %name_len%, %qty_len%, %des_len%
- echo.
-
- set is_data_end=0
- for /f "skip=%n% delims=" %%a in (src.txt) do (
- call :AnalysisLine "%%a"
- if %is_data_end% NEQ 0 goto :end_data
- )
-
- :end_data
- pause
- goto :EOF
-
- :AnalysisLine
- set "AL_line=%~1"
- set AL_id=!AL_line:~0,%id_len%!
- set AL_type=!AL_line:~%type_start%,%type_len%!
- set AL_des=!AL_line:~%des_start%,%des_len%!
-
- if "x%AL_id%"=="x TOTAL" (
- set is_data_end=1
- goto :EOF
- )
-
- if "x%AL_type%"=="x " (
- set "AL_type=%AL_type_LAST%"
- )
-
- set AL_type_LAST=%AL_type%
-
- if "x%AL_type%"=="xDNI" (
- echo [%AL_des%]
- )
- goto :EOF
-
- :headline
- call :Len %1
- set id_len=%Len_Ret%
- call :Len %2
- set /a type_start=%id_len%+3
- set type_len=%Len_Ret%
- call :Len %3
- set num_len=%Len_Ret%
- call :Len %4
- set name_len=%Len_Ret%
- call :Len %5
- set qty_len=%Len_Ret%
- call :Len %6
- set /a des_start=%id_len%+%type_len%+%num_len%+%name_len%+%qty_len%+5*3
- set des_len=%Len_Ret%
- goto :EOF
-
-
- :Len
- set LenVar_i=0
- set LenVar_Str=%~1
- if "x%LenVar_Str%"=="x" (
- set /a Len_Ret=0
- goto :EOF
- )
- :Len_Loop
- set LenVar_c=!LenVar_Str:~%LenVar_i%,1!
- if "x%LenVar_c%"=="x" goto :Len_EndLoop
- set /a LenVar_i+=1
- goto :Len_Loop
-
- :Len_EndLoop
- set /a Len_Ret=LenVar_i
- goto :EOF
复制代码
|