批量分割行的txt文件

时间:2015-07-31 09:53:35

标签: file parsing batch-file

我正在处理一个批处理脚本,它提取了一些行的数据。

我使用以下方法阅读了我的文件:

for /l %%x in (1, 1, !number_of_equipements!) do (
    set x=%%i
    ...processing...
)

但有时候在我的文件中,我分割了这样的一行:

Cisco Web Usage Controls - Web Categorization Prefix Filters: 1438235190 (Thu 
Jul 30 06:00:38 2015)

我需要抓住日期进行一些计算,不幸的是我的x变量将包含分离迭代中的第一行和第二行。

最好的办法是什么?我曾考虑过用一定的条件重写整个文件,或者根据我的脚本正在读取的行做异常,但它都是脏的。有什么好办法吗? 提前感谢您的提议。

2 个答案:

答案 0 :(得分:2)

您可以检查一行是否包含(但不包含);如果两个条件都为真,则将第二行与前一行连接。类似的东西:

@echo off
setlocal enabledelayedexpansion

set "file=whatever.log"

>fixed.log (
    for /f "usebackq delims=" %%I in ("%whatever%") do (
        if defined prev (
            set "line=!prev! %%I"
            set "prev="
            echo(!line!
        ) else (
            set "line=%%I"
            if "!line!" neq "!line:(=!" if "!line!" equ "!line:)=!" (
                set "prev=!line!"
            ) else (
                echo(%%I
            )
        )
    )
)

...然后将日期从固定文本文件中删除,就像线条包装没有弄乱一样。

我还没有测试过这个。您的里程可能会有所不同。

答案 1 :(得分:0)

我已经像这样进行了修改来处理没有括号的行:

>fixed.log (
for /f "usebackq delims=" %%I in ("%file%") do (
    if defined prev (
        set "line=!prev! %%I"
        set "prev="
        echo(!line!
    ) else (
        set "line=%%I"
        if "!line!" neq "!line:(=!" (
            if "!line!" equ "!line:)=!" (
                set "prev=!line!"
            ) else (
                echo(%%I
            )
        ) else (
            echo(%%I
        )
    )
)
)

因此,复制的行仍然存在,我无法弄清楚如何避免......但它就像一个魅力,非常感谢你!