2014-01-15 3 views
0

У меня есть несколько файлов в директории с formatL: data_yyyy_mm_dd_ss.info.datСлияние двоичных файлов на основе даты в именах файлов

Я пытаюсь написать пакетный скрипт, который будет задавать для запуска пользователя/ввода даты окончания (и если вход пользователя будет соответствовать формату файлов yyyy_mm_dd), я хочу, чтобы скрипт выполнял слияние всех соответствующих файлов.

Ex Files: 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; data_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 ???? 

Ex Пользователь Вход: 2013_12_02 и 2013_12_05

Ex Выход: Объединить файлы 2013_12_02 через 2013_12_05.

Благодарим за любую помощь заранее.

+1

Очень странный запрос. Я не знаю многих двоичных файлов, которые можно просто конкатенировать и по-прежнему быть полезными. – dbenham

ответ

0

Предполагаю, вы знаете, что вы делаете, и это действительно, чтобы объединить ваши двоичные файлы.

Следующая должен работать, пока все файлы, которые соответствуют для фильтра являются кандидатами на слияние, и до тех пор, пока пользователь всегда вводит дату в правильном формате (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

+0

Спасибо за помощь, это привело меня на правильный путь. Мне пришлось использовать tokens = 1-4 и if of %% B_ %% C _ %% D, так как %% A получал значение данных. Кроме того, чтобы изменить его, чтобы файлы могли находиться в другом каталоге, мне пришлось сгенерировать список файлов, используя: for/f "delims =" %% d in ('dir/on/b "C: \ LOCATION") do (echo %% ~ nxd >> List.txt) Кроме того, мне пришлось использовать копию NUL% out%, чтобы сначала создать выходной файл. – user3199810

0

Он не имеет проверок почти ничего. Быть осторожен.

Запросить дату начала и окончания. Создавайте минимальные и максимальные файлы на основе ввода данных и итерации по упорядоченному списку файлов. Если файл найден, он считывается с 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 
+0

Я не уверен, почему это не работает, поскольку я попытался использовать его вначале, но я продолжал получать «dir», не признанный как внутренняя или внешняя команда ». Если я удалил часть> merged.info.dat и просто запустил цикл for с эхом, он выдал имена файлов в порядке, но когда я добавил, что output.info.dat вернулся, он всегда терпел неудачу. – user3199810

+0

@ пользователь3199810: мой ошибка. Отсутствует одиночная кавычка в конце предложения 'in' команды' for'. –

Смежные вопросы