【问题标题】:Merge binary files based on dates in the filenames根据文件名中的日期合并二进制文件
【发布时间】:2014-01-15 20:18:39
【问题描述】:

我在一个目录中有多个文件,格式为 L: data_yyyy_mm_dd_ss.info.dat

我正在尝试编写一个批处理脚本,该脚本将要求用户输入开始/结束日期(并假设用户的输入将匹配 yyyy_mm_dd 文件的格式)然后我希望脚本合并所有相关文件。

Ex 文件:data_2013_12_01_32.info.dat; data_2013_12_02_44.info.dat; data_2013_12_03_22.info.dat; data_2013_12_04_33.info.dat;数据_2013_12_05_52.info.dat; data_2013_12_06_12.info.dat

Ex 脚本:

@echo off
set /p start= Start Date:
set /p end= End Date:
copy /b ????

前用户输入:2013_12_02 和 2013_12_05

Ex 输出:合并文件 2013_12_02 到 2013_12_05。

提前感谢您的帮助。

【问题讨论】:

  • 一个非常奇怪的请求。我不知道有很多二进制文件可以简单地连接起来仍然有用。

标签: windows batch-file merge filenames


【解决方案1】:

我假设你知道你在做什么,并且连接你的二进制文件是有效的。

只要符合 FOR 过滤器的所有文件都是合并的候选文件,并且用户始终以正确的格式 (yyyy_mm_dd) 输入日期,则以下内容应该有效:

@echo off
setlocal
set /p start= Start Date:
set /p end= End Date:
set "out=output.info.dat"
for %%F in (data_????_??_??_??.info.dat) do (
  for /f "tokens=1-3 delims=_" %%A in ("%%F") do (
    if "%%A_%%B_%%C" geq "%start%" if "%%A_%%B_%%C" leq "%end%" (
      copy /b "%out%"+"%%F" "%out%" /b
    )
  )
)

作为使用 COPY 的替代方法,您应该能够重定向 FINDSTR 的输出并获得相同的结果。

@echo off
setlocal
set /p start= Start Date:
set /p end= End Date:
>output.info.dat (
  for %%F in (data_????_??_??_??.info.dat) do (
    for /f "tokens=1-3 delims=_" %%A in ("%%F") do (
      if "%%A_%%B_%%C" geq "%start%" if "%%A_%%B_%%C" leq "%end%" (
        findstr "^" "%%F"
      )
    )
  )
)

我不确定哪个更快,COPY 或 FINDSTR

【讨论】:

  • 感谢您帮助我走上正轨。我最终不得不使用 tokens=1-4 和 %%B_%%C_%%D 的 if ,因为 %%A 正在获取数据值。此外,为了更改它以便文件可以位于不同的目录中,我必须使用以下命令生成文件列表: for /f "delims=" %%d in ('dir /on /b "C:\LOCATION"' ) do ( echo %%~nxd >> List.txt) 另外,我必须先使用 copy NUL %out% 来创建输出文件。
【解决方案2】:

它几乎没有检查任何东西。小心点。

询问开始和结束日期。根据数据输入生成最小和最大文件并遍历文件的有序列表。如果找到一个文件,则使用findstr 读取它(第一个选项是type 命令,但它会慢4 到5 倍)并将所有输出重定向到最终合并文件。

@echo off
    setlocal enableextensions disabledelayedexpansion

    set /p "start=Start date :"
    set /p "end=End date   :"

    set "start=data_%start%_00.info.dat"
    set "end=data_%end%_99.info.dat"

    >merged.info.dat (
        for /f "tokens=*" %%f in ('dir /on /b "data_????_??_??_??.info.dat"') do (
            if /i "%%f" geq "%start%" if /i "%%f" leq "%end%" findstr "^" "%%f"
        )
    )

对于很长的文件列表,可以缩写搜索。在这一刻我不知道如何跳过文件列表中最初的不匹配部分,但最后的部分可以很容易地跳过

@echo off
    setlocal enableextensions disabledelayedexpansion

    set /p "start=Start date:"
    set /p "end=End date:"

    set "start=data_%start%_00.info.dat"
    set "end=data_%end%_99.info.dat"

    >output.info.dat (
        for /f "tokens=*" %%f in ('dir /on /b "data_????_??_??_??.info.dat"') do (
            if /i "%%f" geq "%start%" if /i "%%f" leq "%end%"  ( findstr "^" "%%f" ) else ( goto :endMerge )
        )
    )
:endMerge

【讨论】:

  • 我不知道为什么这不起作用,因为我首先尝试使用它,但我不断收到“'dir' 不被识别为内部或外部命令”。如果我删除了 >merged.info.dat 部分并只是运行带有 echo 的 for 循环,它会很好地输出文件名,但是当我将 output.info.dat 添加回来时,它总是失败。
  • @user3199810:我的错。 for 命令的 in 子句末尾缺少单引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2022-01-06
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多