Как получить только первую последовательность чисел в списке, используя пакет или PowerShell - PullRequest
0 голосов
/ 27 октября 2019

Мне нужна первая последовательность чисел в листинге:

Команда:

for /f "delims=" %%a in (notas.txt) do @echo %%a

Возвращает:

Compra cfme NF 12345 de 123 CIA ABC
Pgto dupl. 12345 - 123 CIA ABC
Compra cfme NFS 654321-CIA CBC
Pgto NF 654321 de CIA CBC

Но мне нужноэто:

12345
12345
654321
654321

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 27 октября 2019

Существует множество решений / методов PowerShell, которые могут выполнять все, что требуется.

Оператор switch может использоваться с параметрами -File и -Regex.

switch -Regex -File notas.txt {
  '\d+' { $Matches[0] }
}

Youтакже можно использовать метод Match из класса регулярных выражений:

Get-Content notas.txt | Foreach-Object {
    [regex]::Match($_,'\d+').Value
}

Оба решения основаны на сопоставлении регулярных выражений, при этом \d+ соответствует одной или нескольким последовательным цифрам. Поскольку мы выполняем одно совпадение на строку, первое совпадение является единственным возвращаемым совпадением. Метод класса regex Matches возвращает несколько совпадений для ввода строки.

0 голосов
/ 28 октября 2019

Этот первый код выполняет то, что задает ваш вопрос, но не то, что показывают ваши ожидаемые результаты:

@echo off

:: Pass the entire line to a subroutine
for /f "delims=" %%a in (notas.txt) do call :process %%a

goto :eof


:process
:: Check if we've evaluated the entire line
if "%1"=="" (
   echo No number was found in this line
   goto :eof
)

:: Check if the current parameter is only numbers
:: If it is, then echo and move on to the next line
:: If not, use shift to evaluate the next parameter
echo %1|findstr /i /r "[^0-9]" >nul && shift && goto :process
echo %1
goto :eof

2 вещи. Во-первых, я не знаю, что вы хотите сделать, если номер не найден в строке. В приведенном выше коде я просто повторю «В этой строке не найдено ни одного номера».
Во-вторых, я предположил, что «число» полностью разделено стандартными пробелами в качестве разделителей. Таким образом, приведенный выше код NOT возвращает 654321 из строки Compra cfme NFS 654321-CIA CBC, поскольку 654321-CIA не является числом , разделенным пробелами . Если вам нужны дополнительные разделители, измените эту строку выше:

for /f "delims=" %%a in (notas.txt) do call :process %%a

на:

for /f "tokens=1-10 delims=-., " %%a in (notas.txt) do call :process %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j

добавив любые разделители, которые вы хотите (не забудьте пробел перед двойной кавычкой). Эта строка подходит для до 10 записей в данной строке. Переход к 26 с использованием tokens=1-26 и %%a до %%z довольно прост.
Наконец, если вы хотите получить число без разделителей, тогда это будет совершенно другой подход. Примером будет получение 1356 из PC1356 NLA LOA;или получить 35232 от PC LI-D 35232NDA TTH.

0 голосов
/ 27 октября 2019

С помощью пакетного файла с использованием регулярных выражений в VBScript вы можете сделать что-то вроде этого: Демо Здесь

@echo off & color 0A
Title Extract Numbers from String using Regex with vbscript
Set "InputFile=%~dp0notas.txt"
Set "OutPutFile=%~n0_OutPutFile.txt"
Call :Extract_Number "%InputFile%" CON
Call :Extract_Number "%InputFile%" "%OutPutFile%"
TimeOut /T 3 /NoBreak>nul 
If Exist "%OutPutFile%" Start "" "%OutPutFile%" & Exit
::-----------------------------------------------------------------------------------
:Extract_Number <Input> <OutPut>
(
echo WScript.StdOut.WriteLine Extract_Number(Data^)
echo Function Extract_Number(Data^)
echo      Data = "%~1" 
echo      Data = WScript.StdIn.ReadAll 
echo      Set re = New RegExp 
echo      re.Global = True 
echo      re.IgnoreCase = True  
echo      re.Pattern = "\d{5,}" 
echo      For Each Match in re.Execute(Data^) 
echo          Number = Number ^& Match.Value ^& vbCrLF
echo      Next  
echo     Extract_Number = Number
echo End Function
)>"%tmp%\%~n0.vbs"
cscript //nologo "%tmp%\%~n0.vbs" < "%~1" > "%~2"
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
Exit /B
::----------------------------------------------------------------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...