【问题标题】:Batch .txt processing with multiple columns [closed]具有多列的批处理 .txt 处理[关闭]
【发布时间】:2020-09-13 01:14:41
【问题描述】:

我有个小问题,我想用下面的批处理脚本来编辑数据。

@echo off

set "txt=C:\Users\Desktop\test-batch\input.txt"
set "temp=C:\Users\Desktop\test-batch\output.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;

output.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 /?并阅读帮助文本;您会发现没有%%aa%%ab 等。要获得更多令牌,请嵌套两个for /F 循环,如下所示:for /F "usebackq tokens=1-25* delims=;" %%A in ("%txt%") do for /F "tokens=1-18 delims=;" %%a in ("%%Z") do echo %%A...%%Y; %%a...%%r。或者,更改tokens 选项以跳过您不使用的令牌:for /F "usebackq tokens=1,29* delims=;" %%A in ("%txt%") do echo %%A;%%B;%%C。无论如何,请注意连续的分隔符被折叠成一个!
  • 我强烈建议您使用edit your question 并包含您想要的输出:(
  • 谢谢,这行得通:for /F "usebackq tokens=1-25* delims=;" %%A in ("%txt%") for /F "tokens=1-18 delims=;" %%a in ("%%Z") 做回波 %%A;%%M;%%N;%%O;%%P;%%Q;%%R;%%S;%%T;% %U;%%V;%%W;%%X;%%Y;%%a;%%b; > %temp%

标签: windows csv batch-file cmd


【解决方案1】:

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

请不要忘记在测试前更正23 行中的文件路径。

@Echo Off&SetLocal EnableExtensions DisableDelayedExpansion
Set "source=C:\Users\Desktop\test-batch\input.txt"
Set "target=C:\Users\Desktop\test-batch\output.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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多