Войти

Показать полную графическую версию : [решено] Проверить нужное количество текста в каждом блоке txt файла


Alexander_88
25-08-2019, 09:02
Здравствуйте. Можно ли проверить нужное количество найденного текста в каждом блоке txt файла с помощью скрипта?
Нужно проверить всю папку с txt файлами.. только одну папку (входящие в нее папки проверять не нужно). Эта папка будет с txt файлами, в этих файлах много блоков текста, разделенных разделителем. Над каждым разделителем есть ссылка на файл. Необходимо проверить, чтобы имя файла в ссылке (без расширения) находилось в текущем блоке 4 раза (считая имя в ссылке на файл). Т.е. чтобы эта фраза нашлась 4 раза в текущем блоке. В каждом блоке свое имя файла, но время от времени это имя может повторяться. Если в каком то блоке количество фраз (имен файла) не 4, то должно вывестись на экран имя файла в ссылке (в текущем блоке), а также имя txt файла, где находится текущий блок.
Разделитель такой: //==================

Пример одного txt файла (на самом деле блоков будет гораздо больше).

файл film.txt
shdfgjlhasdjlghsjlahgsajghsdlag
http://s5.depic.me/01426/2zysleesxtfn_o/hdptitle.jpg

http://s7.depic.me/01425/w1xhdfhweudsl6_o/0001start_m.jpg
http://s7.depic.me/01425/34s1fhsfsyo_o/0001start_t.jpg

File Name.type: 0001start.mp4
Resolution: 1920x1080
Duration: 0:01:05
Filesize: 47Mb

Download
https://fboom.me/file/edsdhsdf0d1/0001start.mp4
//==================
shdfgjlhasdjlghsjlahgsajghsdlag


http://s7.depic.me/01425/rqhdfdu6_o/0002start_m.jpg
http://s7.depic.me/01425/uksdffiv0zy_o/0002start_t.jpg

File Name.type: 0002start.mp4
Resolution: 1280x720
Duration: 0:00:12
Filesize: 11Mb

Download
https://fboom.me/file/5115645603f/0002start.mp4
//==================
lasjgklhjwreak;lghsjklgljasg
http://s6.depic.me/02008/t8gertar3s6_o/karton0001_m.jpg
http://s6.depic.me/02008/s93wegbe9n_o/karton0001_t.jpg

karton0034.wmv | 1280x720 | 0:09:35 | 272Mb

Download
https://k2s.cc/file/d7eeewfg845/karton0001.mp4
//==================
lasjgklhjwreak;lghsjklgljasg
http://s7.depic.me/02008/sgo9rthhv3f_o/karton0002_m.jpg
http://s7.depic.me/02008/i9ppqrw7eif_o/karton0002_t.jpg

karton0002.avi | 720x540 | 0:06:01 | 135Mb

Download
https://k2s.cc/file/011fgdfdcbec/karton0002.mp4
//==================

Результат:
karton0001 - file.txt

Почему такой результат? В третьем блоке, по ссылке над разделителем, имя файла (без расширения) получается karton1.., так вот, эта фраза (karton1) находится в текущем (третьем) блоке не 4 раза (а всего 3). Поэтому вывелось имя файла в ссылке и имя txt файла, где находится этот блок. Во всех других блоках найденные имена файлов в ссылках над разделителями находятся по 4 раза, т.е. там все совпадает и поэтому не выводится на экран. :)

YuS_2
25-08-2019, 15:03
Над каждым разделителем есть ссылка на файл. Необходимо проверить, чтобы имя файла в ссылке (без расширения) находилось в текущем блоке 4 раза (считая имя в ссылке на файл). »
Если в каком то блоке количество фраз (имен файла) не 4, то должно вывестись на экран имя файла в ссылке (в текущем блоке), а также имя txt файла, где находится текущий блок. »

function parsefile {
process{
$fname = $_.name
if (($x = gc $_.fullname -raw) -match $split){
[array]$arr = $x -split $split
if ($arr.length -gt 1){
for($i=0;$i -lt $arr.length-1;$i++){
$arr[$i] -match '(?<=\)([^\[]+)(?=\)'|out-null
if($matches[1]){
$uri = [uri]$matches[1]
$r = ([io.fileinfo]$uri.segments[-1]).basename
$cnt = (sls -inp $arr[$i] -patt $r -all).matches.count
if($cnt -ne $count){
write-host $r - $fname -for magenta
}
} else { write-host Error! Name file not found. -for red }
}
}
} else { write-host Error! $split - not found -for red }
}
}

$fld = 'd:\*'
$flt = '*.txt'
$split = "//=================="
$count = 4

dir $fld -inc $flt -file|parsefile

Alexander_88
25-08-2019, 20:41
Спасибо, все работает, только почему то файлы, в имени которых есть символы "[" "]" (квадратные скобки), не обрабатываются и появляются ошибки:

Get-Content : Не удается найти параметр, соответствующий имени параметра "raw".
C:\Users\Alexander\work\new\Новый текстовый документ.ps1:4 знак:28
+ if (($x = gc $_.fullname -raw) -match $split){
+ ~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-Content], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Iska
25-08-2019, 21:41
Alexander_88, это особенность любого языка, в котором некоторые символы внутри строк могут рассматриваться как специальные. С одной стороны, это даёт некоторые плюсы, с другой — минусы, с одним из которых Вы познакомились.

Сравните:
Get-ChildItem -Path 'C:\Мои проекты\0274' -File |`
ForEach-Object -Process {
$_.FullName
Get-Content -Path $_.FullName
}

C:\Мои проекты\0274\0001.txt
0001.txt content here
C:\Мои проекты\0274\[0002].txt
Get-Content : An object at the specified path C:\Мои проекты\0274\[0002].txt does not exist, or has been filtered by the -Include or -Exclude parameter.
At line:3 char:9
+ Get-Content -Path $_.FullName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (System.String[]:String[]) [Get-Content], Exception
+ FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand

и:
Get-ChildItem -Path 'C:\Мои проекты\0274' -File |`
ForEach-Object -Process {
$_.FullName
Get-Content -Path $([Management.Automation.WildcardPattern]::Escape($_.FullName))
}

C:\Мои проекты\0274\0001.txt
0001.txt content here
C:\Мои проекты\0274\[0002].txt
[0002].txt content here

Статический метод .Escape() класса Management.Automation.WildcardPattern экранирует в данном случае обе квадратные скобки в имени второго файла, в результате чего получается:
C:\Мои проекты\0274\`[0002`].txt

DJ Mogarych
25-08-2019, 22:39
файлы, в имени которых есть символы "[" "]" (квадратные скобки), не обрабатываются »
Вместо параметра -Path надо использовать -LiteralPath.

YuS_2
26-08-2019, 02:45
файлы, в имени которых есть символы "[" "]" (квадратные скобки), не обрабатываются и появляются ошибки »
Помимо способов обхода проблемы, описанных выше, стоит ещё добавить, что это не просто прихоть разработчиков или недоработка в powershell, это так называемая полезная "фича".
Квадратные скобки в путях используются для расширения возможностей простых шаблонов "*", "?", т.е. они позволяют ещё использовать и диапазоны типа [a-d], [aem] или [0-9] в именах. Например:
dir [a-c]*.* -file
- найдет все файлы с любым расширением, но только с именем, начинающимся на a, b или c ...

Alexander_88
26-08-2019, 05:17
Теперь квадратные скобки не проблема, спасибо :)




© OSzone.net 2001-2012