具有多列的批处理.txt处理



我有一个小问题,我想使用以下批处理脚本编辑数据。

@echo off
set "txt=C:UsersDesktoptest-batchinput.txt"
set "temp=C:UsersDesktoptest-batchoutput.txt"
for /f "tokens=1-43 delims=; " %%a in (%txt%) do echo %%a;%%ac;%%ad;%%ae;%%af;%%ag;%%ah;%%ai;%%aj;%%ak;%%al;%%am;%%an;%%ao;%%ap;%%aq; > %temp%

输入.txt:

1;2;2;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;1;;;1-Trackingnummer;2-Trackingnummer;3-Trackingnummer;4-Trackingnummer;5-Trackingnummer;6-Trackingnummer;7-Trackingnummer;8-Trackingnummer;9-Trackingnummer;10-Trackingnummer;11-Trackingnummer;12-Trackingnummer;13-Trackingnummer;14-Trackingnummer;15-Trackingnummer;

输出.txt(列1和列29-43(:

1;1-Trackingnummer;2-Trackingnummer;3-Trackingnummer;4-Trackingnummer;5-Trackingnummer;6-Trackingnummer;7-Trackingnummer;8-Trackingnummer;9-Trackingnummer;10-Trackingnummer;11-Trackingnummer;12-Trackingnummer;13-Trackingnummer;14-Trackingnummer;15-Trackingnummer;

有人可以告诉我问题在哪里以及为什么它不起作用吗?

接下来是一个潜在的解决方案,它不像for /f循环那样使用tokensdelimiters。这样做的想法是输出1标记,并29-43semicolon分隔行(根据您的示例(。

在测试之前,请不要忘记更正第2行和3中的文件路径。

@Echo Off&SetLocal EnableExtensions DisableDelayedExpansion
Set "source=C:UsersDesktoptest-batchinput.txt"
Set "target=C:UsersDesktoptest-batchoutput.txt"
If Exist "%source%" (For %%G In ("%source%")Do If "%%~aG" GEq "d" GoTo :EOF)Else GoTo :EOF
For %%G In ("%target%..")Do If "%%~aG" Lss "d" GoTo :EOF
For /F "Delims==" %%G In ('Set f[ 2^>NUL')Do Set "%%G="
(For /F Delims^=^ EOL^= %%G In ('Type "%source%"')Do Call :Sub "%%G") 1> "%target%"
GoTo :EOF
:Sub
SetLocal EnableDelayedExpansion
If "%~1" == "" Exit /B
Set "line=%~1"
Set "i=1"
Set "f[!i!]=%line:;="&Set /A i+=1&Set "f[!i!]=%"
Set "out=!f[1]!;"
For /L %%I In (29,1,43)Do Set "out=!out!!f[%%I]!;" 
Echo(%out%
EndLocal
Exit /B

5行和第6行只是检查源和目标是否有效。如果源不是现有文件,或者目标文件目录不存在,则关闭脚本。

8行确保我们没有名称以f[开头的预定义变量。

10行从源文件中读取,并将每一行传递到执行令牌分析的:Sub标签。

:Sub标签中的代码使用分隔符拆分每个标记,将每个标记设置为一个自变量(f[#],其中#是标记编号(。然后将所需的变量连接到一个保持变量(%out%(,最后echoed 到%target%中。

在您的情况下,您的大多数令牌都是一个完整的范围,因此我能够使用令牌1传播%out%(第19行(并且所有范围都29..45在线20上。如果您的令牌发生变化,那么您可以将行1920替换为Set "out=",例如 分别For %%I In (1 29 32 34 35 37 39 43)Do Set "out=!out!!f[%%I]!;"

请注意,这个想法是为了能够执行您在问题中列出的任务而编写的。它具有行字符长度限制,令牌的数量限制为环境允许的大小。

最新更新