分析一个带行的文本文件并用分隔符分隔



批量解析长一行文本文件时,我遇到了问题,特别是 1024 个字符的限制,因为我将变量设置为文件的内容,它只会抓取前 1024 个字符。

我想通过设置分隔符(我使用 ~ 作为我的分隔符)将我的文本文件拆分到新行并将结果输出到另一个文本文件中。传入的文件如下所示:

line1~line2~line3~line4~etc~

一直到例如 5000 个字符。我希望结果看起来像:

line1~
line2~
line3~
line4~
etc~

这是我当前的代码:

@echo off
set /p input=<input.txt
call :parse "%input%"
pause
goto :eof
:parse
setlocal
set var=%~1
for /F "tokens=* delims=~" %%a in ("%var%") do (
    if not "%%a" == "" call :splitVar "%%a"
    if not "%%b" == "" call :parse "%%b"
)
endlocal
pause
goto :eof
:splitVar
setlocal
echo %~1
set filename=%~1
goto :eof

有没有办法克服 1024 个字符的限制或某种方式解析它?

另外,让我知道这个问题是否以任何方式违反规则。我对堆栈溢出有点陌生。

@ECHO OFF
SETLOCAL
FOR /f "delims=" %%a IN (q2904836.txt) DO call :parse "%%a"
pause
goto :eof
:parse
setlocal
set var=%~1
:parseloop
IF DEFINED var for /F "tokens=1* delims=~" %%a in ("%var%") do (
    if not "%%a" == "" call :splitVar "%%a"&SET "var=%%b"&GOTO parseloop
)
endlocal
pause
goto :eof
:splitVar
setlocal
echo %~1
set filename=%~1
goto :eof

我使用了一个名为 q2904836.txt 的文件,其中包含一些用于测试的数据。

堆栈的范围是有限制的,您正在为行中的每个条目调用:parse,这将超出限制。

注意使用 tokens=1* ,将下一个标记分配给 abd %%a 将余数分配给%%b

以演示的方式使用 for/f 将克服 1024 限制 - 但仍有略高于 8100 个字符的限制。

另请注意,您在 :parse 中的setlocal/endlocal和 ':splitvar' 中的 setlocal/implicit-endlocal 将意味着在这些例程中可能已经建立或更改的变量将被丢弃。

限制不是 1024,而是 8191。

拆分的工作方式与您想象的略有不同。

它拆分为多个令牌,但您需要其他解决方案。

您可以将所有 - 符号替换为换行符,然后获得所需的结果。

Setlocal enabledelayedexpansion
Set LF=^

for %%a in ("!LF!") do set var=!var:-=%%a!
For /f "delims=" %%a in ("!var!") Do echo %%a

最新更新