Войти

Показать полную графическую версию : [решено] Три строки


Freddy1984
26-07-2019, 12:43
Здравствуйте!
Помогите пожалуйста с реализацией переподвыподверта :help: .
Есть текстовый файл. В нем может попадаться три строки с одинаково начинающимся словом.
Нужно сделать так, что бы в случае нахождения трёх идущих по очереди строк (с одинаковым первым словом), первая и третья удалялись, а оставалась только центральная.
То есть удалялись первая и третья только в том случае, если они идут подряд одна за другой.

Пример текста в файле:

Действия баз данных
Автоматизация действий и базы данных
Программирование, базы данных, и много всего
Программирование, базы данных и автоматизация действий
Программирование, базы данных
Скриптовые языки администрирования Windows
Программирование, базы данных и автоматизация действий
Языки администрирования Windows

ТРИ строки начинающиеся со слова "Программирование" идут подряд. Если таковое в наличии в файле, то удаляем "Программирование, базы данных, и много всего" и "Программирование, базы данных". Оставляем только "Программирование, базы данных и автоматизация действий".

Буду очень признателен, если это возможно сделать на CMD. :hi:

Busla
26-07-2019, 13:11
трёх одинаковых идущих по очереди строк, первая и третья удалялись, а оставалась только центральная. »
если строки одинаковые - какая разница: которую удалять?

Freddy1984
26-07-2019, 13:27
если строки одинаковые - какая разница: которую удалять? »
Я прошу прощения, может не совсем корректно выразился. Имеется в виду три строки с одинаково начинающимся словом.
На примере я более подробно всё показал.

Freddy1984
26-07-2019, 14:28
А если 4 строки начинается с одного слова? А 5? »
Лично в моём случае этого не будет.
У меня либо одна, либо три. Если три, то первую и третью надо удалить.

Sham
26-07-2019, 14:30
так что-ли? https://regex101.com/r/RcQmDw/1

Freddy1984
26-07-2019, 14:49
так что-ли? »
похоже что так, а в CMD это можно как то перевести. это на php как я понял? :)

Busla
26-07-2019, 14:55
в удобоваримую форму это можно как то вывести? »
если под удобоваримой форме вы подразумеваете cmd, то никак
а если файл большой, то регулярками и вовсе не стоит решать эту задачу

Freddy1984
26-07-2019, 14:57
ок, если под CMD никак, то ясно. Спасибо что откликнулись.

megaloman
26-07-2019, 15:10
@Echo Off
cls
chcp 1251 >nul
Set "FileIn=Z:\Box_In\Есть текстовый файл.txt"

If Not Exist "%FileIn%" (Echo !!! File "%FileIn%" not found &Pause &Exit /b 2)

Set /A N=10000000
Set /A NN=0

FOR /F "usebackq tokens=1* delims=:" %%i IN (`2^>nul FINDSTR /N /R /C:"^.*" "%FileIn%"`) DO (
Set /A NN=%N%+%%i
Call Set "@@@%%NN%%=%%j"
)

If %NN%==0 (Echo !!! No string in "%FileIn%" &Pause &Exit /B 1)

Set /A M1=%N%
:Begin
Set /A M1+=1
Set /A M2=%M1%+1, M3=%M1%+2

If %M3% GTR %NN% GoTo :End

Call :Word1 "%%@@@%M1%%%" "W1"
Call :Word1 "%%@@@%M2%%%" "W2"
Call :Word1 "%%@@@%M3%%%" "W3"

If /I "%W1%"=="%W2%" If /I "%W1%"=="%W3%" (
Set "@@@%M1%="
Set "@@@%M3%="
Set /A M1=%M3%
)
GoTo :Begin
:End

>"%FileIn%" (FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@@@"`) DO Echo %%j)
Pause
Exit /B

:Word1
FOR /F "tokens=1 delims=,.:!?- " %%w IN (%1) DO Set "%~2=%%w"
Exit /B 0

DJ Mogarych
26-07-2019, 23:20
так что-ли? https://regex101.com/r/RcQmDw/1 »
Если этот ужас адаптировать для Select-String -pattern "_ужас_" в powershell, то это, видимо, и будет искомое.
Я не смог распарсить с непривычки.

Iska
26-07-2019, 23:45
DJ Mogarych, а нужно ли здесь Select-String?

Busla
26-07-2019, 23:57
Iska, командлеты PowerShell - это и есть нормальное использование PowerShell, а не ваше любимое прямое обращение к методам и классам .NET

Iska
27-07-2019, 00:48
Busla, я имел в виду простой оператор -replace.

DJ Mogarych
27-07-2019, 06:54
Iska, может, и не нужно.
Кстати, приведённый регекс не работает в таком примере:
Действия баз данных
Автоматизация действий и базы данных
Программирование, базы данных, и много всего
Программирование, базы данных и автоматизация действий
Программирование, базы данных
Скриптовые языки администрирования Windows
Программирование, базы данных и автоматизация действий
Языки администрирования Windows, раз
Языки администрирования Windows, два
Языки администрирования Windows, три

Sham
27-07-2019, 08:55
не работает »
потому что в конце переноса нет.
С m-флагом и якорем на порядок производительнее https://regex101.com/r/RcQmDw/3




© OSzone.net 2001-2012