【问题标题】:.bat file to merge .txt into one file, including filename but separated by a ';'.bat 文件将 .txt 合并为一个文件,包括文件名,但用“;”分隔
【发布时间】:2016-04-08 23:31:38
【问题描述】:

我遇到了一个特定的问题。

我工作的公司使用的监控软件(用于制造车间的机器人)每 15 分钟生成一个日志文件 (.sdat)。日志文件的内容如下所示:

语法:Time;machine;status

13:53:23;KP85;ms:9999

13:53:49;KP85;ms:3

13:54:54;KP85;ms:4

14:06:04;KP85;ms:9999

13:51:38;Robot1;ms:9999

等等……

我已经设法将所有日志文件连接到一个大文件中,包括每个新行开头的文件名,如下所示:

语法:Filename:Time;Machine;Status

01-03-2016-00-20.sdat:0:07:40;KP65;ms:3

01-03-2016-00-20.sdat:0:09:09;KP65;ms:4

01-03-2016-00-20.sdat:0:09:11;KP65;ms:3

01-03-2016-00-20.sdat:0:09:13;KP65;ms:4

等等。

我这样做的原因是因为我需要时间和日期(包含在文件名中)已经记录了机器的特定状态。但是,如果我将其导入 SQL 管理工作室,它会识别 3 列而不是 4 列,因为文件名和第一列(时间)由“:”而不是“;”分隔。我尝试用 SQL Query 解决它,用 LEFT() 和 RIGHT() 分隔日期和时间,但猜猜看:当时间从 9:59:59 切换到 10:00:00 时,时间字段格式会发生变化,为时间字段创建一个额外的字符(因此列中的数据看起来像这样 ':9:59:59',这不是有效的时间字段)。也许它可以用 SQL 来完成,但在我看来,对于这样一个小问题,SQL 代码会花费太多的复杂性。

所以在这一点上,我认为尽早解决这个问题会更好;在生成大文件的批处理文件中,因此 Management Studio 确实识别 4 列而不是 3 列。这就是我的 .bat 文件现在的样子:

@echo off findstr "^" *.sdat >output.txt

我该怎么做才能做到这一点?

提前致谢,

迈克·索恩斯

【问题讨论】:

    标签: sql batch-file logging concatenation


    【解决方案1】:
    @echo off
    (for %%f in (*.sdat) do (
      for /f "delims=" %%a in (%%f) do @echo %%f;%%a
    ))>output.txt
    

    注意:这会吞下空行,但我认为在你的情况下这不是问题。如果是,可以修改代码。

    【讨论】:

    • 空行无所谓,但无法生成输出,因为找不到%%i
    • 好的,谢谢。周一上班的时候试试看!
    • 谢谢斯蒂芬,你的代码有效!它现在生成这样的行:01-03-2016-00-20.sdat;0:09:13;KP65;ms:4 这正是我想要的。但是,生成文件确实需要更多时间,但谢谢!
    【解决方案2】:

    鉴于您要连接的所有日志文件都具有 sdat 扩展名,您必须替换 sdat: for sdat;为了有一个;分隔的 CSV。

    要实现这一点,您可以在另一个答案 (How to replace substrings in windows batch file) 中使用批处理脚本,它使用批处理脚本替换文本文件中的子字符串。

    【讨论】:

    • 是否可以在同一个批处理文件生成的文本(每行开头的文件名)中进行搜索和替换?
    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多