Выберите информацию из TXT в файле Bat - PullRequest
2 голосов
/ 28 сентября 2019

Существует текстовый файл, в котором хранится журнал обработанных файлов в следующем формате:

Имя: kn-25.txt Дата: 01.02.2013 Время: 14: 50

Задача состоит в том, чтобы записать пакетный файл, который будет делать выбор из этого файла для данного месяца (мм) и года (гггг) в файл result.txt.

@echo off
chcp 1251 >nul
setlocal EnableDelayedExpansion
echo Введіть початковий файл:  
set /p in_file=%~nx1
if not exist %in_file% goto end

del D:\result.txt
set /a count=0
set /a con=0
set /a min=101
set /p month=Введіть місяць: 
if [%month%] == [] goto end 
set /p year=Введіть рік: 
if [%year%] == [] goto end 
goto start

:start
if count equ 0 (
set /a con=0 
) else (
set /a con=0-!count!
)
for /f "tokens=*" %%i in (%in_file%) do (
    for /f "tokens=1-6" %%a in ("%%~i") do (
        for /f "delims=. tokens=1-3" %%u in ("%%~d") do (
            if "%%v"=="%month%" if "%%w"=="%year%" (
                 set /a con=!con!+1 
                     if "%%u" leq "!min:~-2!" (
                         set /a min1=!min!-1
                         if "%%u" neq "!min1:~-2!" (
                            set /a count=!count!+1                    
                            echo !count!. %%i>>D:\result.txt
                    )
                )
            )       
        )   
    )
)

if %con% neq %count% (
set /a min=!min!+1
goto start
) else (
type D:\result.txt
echo 
@pause
endlocal
exit /B 
)

:end
echo Ви не ввели параметр!
echo   
@pause
endlocal
exit /B 

Я написал этот код, но получил ошибку:

Не удается найти имя файла:.

Есть предложения?

Примечание: информация в сгенерированном файле должна быть отсортирована по дате

Пример:

Исходное содержимое файла:

Имя: kn-25.txt Дата: 07.03.2013 Время: 14: 50

Имя: kn-26.txt Дата: 02.03.2013 Время: 23: 50

Имя: MyFil.txt Дата: 03.08.2012 Время: 12: 00

Имя: ca-21.txt Дата: 28.03.2013 Время: 01: 00

Имя: ca-25.txt Дата: 01.30.2012 Время: 10: 05

Ввод: 03.2013

Выход:

Имя: kn-26.txt Дата: 02.03.2013 Время: 23: 50

Имя: kn-25.txt Дата: 07.03.2013 Время: 14: 50

Имя: ca-21.txt Дата: 28.03.2013 Время: 01: 00

Ответы [ 4 ]

0 голосов
/ 29 сентября 2019

В следующем коде используется временный файл, содержащий строки из входного файла, отфильтрованные по заданной информации о дате (месяц и год), но с каждой строкой с префиксом год, месяц и день, что позволяет легко выполнять алфавитную сортировку, которая подходит дляВаш формат даты фиксированной ширины.Обратите внимание, что это полностью не проверено:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "IN_FILE=%~1"
set "OUT_FILE=D:\result.txt"
set "TMP_FILE=%TEMP%\%~n0_%RANDOM%.tmp"
set "MONTH=03"
set "YEAR=2013"

rem /* Filter lines for given month and year, then write them
rem    to temporary file, preceded by year, month, date and `:`: */
> "%TMP_FILE%" (
    for /F usebackq^ delims^=^ eol^= %%L in ("%IN_FILE%") do (
        for /F "tokens=3 delims=:" %%D in ("%%L") do (
            for /F "tokens=1-3 delims=. " %%A in ("%%D") do (
                if "%%B" == "%MONTH%" if "%%C" == "%YEAR%" (
                    echo(%%C%%B%%A:%%L
                )
            )
        )
    )
)
rem /* Sort content of temporary file, remove prefix
rem    up to the (first) `:` and write to result file: */
> "%OUT_FILE%" (
    for /F "tokens=1* delims=:" %%E in ('sort "%TMP_FILE%"') do (
        echo(%%F
    )
)
rem // Clean up temporary file:
del "%TMP_FILE%"

endlocal
exit /B
0 голосов
/ 28 сентября 2019

Если вы работаете на поддерживаемом компьютере с Windows, на нем будет PowerShell.Вот один из способов сделать это.Предполагается, что дата указана в формате ДД.ММ.ГГГГ.

Поскольку она уже проанализировала дату и время с помощью регулярного выражения, она создает [DateTime] для связи со строкой файла журнала.Затем он использует этот [DateTime] для сортировки файла, но выводит только строку файла журнала.

[CmdletBinding()]
param (
    [Parameter(Mandatory=$true,Position=0)]
    [string]$LogFile
    ,[Parameter(Mandatory=$true,Position=1)]
    [int]$Year
    ,[Parameter(Mandatory=$true,Position=2)]
    [int]$Month
)

Get-Content -Path $LogFile |
    ForEach-Object {
        if ($_ -match 'Name: .* Date: ((\d*).(\d*).(\d*)) Time: ((\d*):(\d*))') {
            #$Matches
            $fday = [int]$Matches[2]
            $fmonth = [int]$Matches[3]
            $fyear = [int]$Matches[4]
            $fhour = [int]$Matches[6]
            $fminutes = [int]$Matches[7]
            if (($fmonth -eq $Month) -and ($fyear -eq $Year)) {
                [PSCustomObject]@{
                    Line = $_
                    Timestamp = Get-Date -Year $fyear -Month $fmonth -Day $fday `
                        -Hour $fhour -Minute $fminutes -Second 0
                }
            }
        }
    } |
    Sort-Object -Property Timestamp |
    ForEach-Object { $_.Line }

Вызовите его, используя следующую команду.Если вы не предоставите параметры, PowerShell запросит их.Это похоже на использование SET /P в скрипте bat-файла cmd.exe.

.\logparse.ps1 -LogFile '.\logparse.in.txt' -Year 2013 -Month 2

Если вам нужно запустить его из оболочки cmd.exe, используйте:

powershell -NoLogo -NoProfile -File ".\logparse.ps1"
0 голосов
/ 28 сентября 2019

немного другой подход (медленнее, чем другие, но работает как задумано):

@echo off
setlocal EnableDelayedExpansion

set in_file=t.txt
set month=03
set year=2013

(for /l %%a in (100,1,131) do (
  set "day=%%a"
  findstr "!day:~-2!.%month%.%year%" %in_file% 
))>result.txt
0 голосов
/ 28 сентября 2019

Для сортировки мы игнорируем первые 22 символа команды sort.

@echo off
chcp 1251 >nul
setlocal EnableDelayedExpansion
echo Введіть перший параметр: 
set /p in_file=%~f1
if not exist %in_file% goto end


set /p month=Введіть місяць:
if [%month%] == [] goto end
set /p year=Введіть рік:
if [%year%] == [] goto end 

findstr /C:"%month%.%year%" %in_file% | sort /+22 > D:\result.txt

type D:\result.txt 
pause
exit /B

:end
echo Ви не ввели параметр! 
pause
exit /B

Мы можем использовать findstr /O, если мы хотим смещение в каждой строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...