如何在Windows批处理中正确地安排记录?

3

我有一个名为s_result.txt的文件:

AAA,BBB,CCC
DDD,EEE
FFF,GGG
HHH,III,JJJ
...

我尝试像这样获取sf_result.txt:

AAA,BBB
AAA,CCC
DDD,EEE
FFF,GGG
HHH,III
HHH,JJJ
...

我使用了以下脚本:

```

REM Transfer s_result.txt to sf_result.txt
DEL sf_result.txt
Echo. 2>sf_result.txt
for /F "tokens=1,2,3 delims=," %%a in (s_result.txt) do (
If %%c EQU [] (
ECHO %%a,%%b>>sf_result.txt
) else (
ECHO %%a,%%b>>sf_result.txt
ECHO %%a,%%c>>sf_result.txt
)
)

我得到了这个result.txt文件:
AAA,BBB
AAA,CCC
DDD,EEE
DDD,
FFF,GGG
FFF,
HHH,III
HHH,JJJ
...

我该如何得到正确的结果?
谢谢。
3个回答

2
如果你想逐行解析,请使用for /F。如果你想在单行上逐个词汇进行标记化,请使用不带/Ffor。此外,在基本的for循环中,Windows已经在未引用逗号上进行了标记化,无需指定分隔符。(它还在空格、制表符和分号上进行标记化。)考虑到这一点,解决方案实际上非常简单。
@echo off & setlocal

for /f "usebackq tokens=1* delims=," %%I in ("test.txt") do (
    for %%x in (%%J) do (
        echo(%%I,%%x
    )
)

输出:

AAA,BBB
AAA,CCC
DDD,EEE
FFF,GGG
HHH,III
HHH,JJJ


(注意保留HTML标签)

1

我喜欢rojo聪明的方法(+1)。

为了克服他提到的影响,我考虑采用递归方法。

:: Q:\Test\2018\06\28\SO_51073893.cmd 
@echo off & setlocal
for /f "usebackq tokens=1-2* delims=," %%A in ("test.txt") do Call :Sub "%%A" "%%B" "%%C"
Goto :Eof
:Sub
Echo %~1,%~2
if "%~3" neq "" for /f "tokens=1* delims=," %%D in (%3) do Call :Sub %1 "%%D" "%%E"

使用稍作修改的文件test.txt,我得到了以下输出:

> SO_51073893.cmd
AAA,B=B
AAA,C;C
DDD,EEE
FFF,GGG
HHH,I I
HHH,JJJ

1
已经有一些聪明的方法提供了很好的答案。
然而,我想坚持你在这里发布的代码。
主要问题在于行if %%c EQU [],因为它将第三个标记与文字字符串[]进行比较;根据你的示例,第三个标记可以是CCCJJJ或空字符串,所以条件永远不会得到满足。
为了更正这一点,你应该写成if "%%c"==""
你可以进一步改进你的脚本,通过对输出文件进行单个redirection >,而不是事先创建文件并多次添加;只需将整个for /F循环放在括号之间并重定向整个块即可。
因此,这是已修正和改进的代码:
rem Transfer s_result.txt to sf_result.txt
> "sf_result.txt" (
    for /F "usebackq tokens=1-3 delims=," %%a in ("s_result.txt") do @(
        if "%%c"=="" (
            echo %%a,%%b
        ) else (
            echo %%a,%%b
            echo %%a,%%c
        )
    )
)

"

@符号可以防止循环体的命令回显被写入输出文件中。如果在脚本开头放置了@echo off,则不再需要该符号。

当然,此代码无法正确处理超过三个标记的行。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接