YuS_2
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору LevT Цитата: Метод-то хороший, но боюсь, что в реальных файлах .php многоточие вряд ли присутствует, поэтому использовать его в шаблоне нельзя. И кроме того, на выходе человек хотел получить файл csv, определенного содержания... Да и файлы .php могут сильно отличаться по содержанию, чтобы использовать для разбора шаблоны, именно поэтому был задан вопрос про образцы файлов, но видимо, задавший вопрос потерял интерес к самой задаче, т.к. ничего не отвечает... А в общем случае, чтобы не теряться в догадках, что же там присутствует в тех файлах, пусть и с оговорками, проще сделать так: Код: function init-obj { $script:obj = [pscustomobject]@{ 'Name'=$null;'Given Name'=$null;'Additional Name'=$null;'Family Name'=$null;'Yomi Name'=$null 'Given Name Yomi'=$null;'Additional Name Yomi'=$null;'Family Name Yomi'=$null;'Name Prefix'=$null 'Name Suffix'=$null;'Initials'=$null;'Nickname'=$null;'Short Name'=$null;'Maiden Name'=$null 'Birthday'=$null;'Gender'=$null;'Location'=$null;'Billing Information'=$null;'Directory Server'=$null 'Mileage'=$null;'Occupation'=$null;'Hobby'=$null;'Sensitivity'=$null;'Priority'=$null 'Subject'=$null;'Notes'=$null;'Language'=$null;'Photo'=$null;'Group Membership'=$null 'Phone 1 - Type'=$null;'Phone 1 - Value'=$null;'Organization 1 - Type'=$null;'Organization 1 - Name'=$null 'Organization 1 - Yomi Name'=$null;'Organization 1 - Title'=$null;'Organization 1 - Department'=$null 'Organization 1 - Symbol'=$null;'Organization 1 - Location'=$null;'Organization 1 - Job Description'=$null } } function init-tmp { $script:tmp = new-object 'system.object[]' 3 } $fld = 'test' $flt = '*.php' $out = 'test.csv' if (test-path $out){del $out} dir $fld\* -filt $flt -file|%{$arr=@()}{ gc $_.fullname -enc utf8|%{$flg1,$flg2=$false,$false;init-tmp;init-obj}{ if ($_ -match '<div class=\"username\"><h4>\s*(.*?)\s*<span class=\"position\">[^<]*</span></h4></div>'){ $tmp[0] = $matches[1] # [0] Nickname } if ($tmp[0]){ if ($_ -match '<dt>\s*Имя:\s*</dt>'){$flg1 = $true} if ($_ -match '<dt>\s*Телефон:\s*</dt>'){$flg2 = $true} if ($_ -match '<dd><a\s*href=\"[^\"]*\"\s*title=\"[^\"]*\">\s*(.*?)\s*</a></dd>'){ $obj.Nickname = $tmp[0];$obj.Name = $tmp[1];$obj.'Given Name' = $tmp[1] $obj.'Phone 1 - Value' = $tmp[2];$obj.Notes = $matches[1] # [3] Notes $arr += $obj;init-obj;init-tmp } } if ($flg1){ if ($_ -match '<dd>(.*?)</dd>'){ $tmp[1] = $matches[1] # [1] Name, Given Name $flg1 = $false } } if ($flg2){ if ($_ -match '<dd>(.*?)</dd>'){ $tmp[2] = $matches[1] # [2] Phone 1 - Value $flg2 = $false } } } } $arr |export-csv $out -app -force -not -enc utf8 | - с учетом того, что последовательность строк, содержащих требующиеся элементы, первого и последнего элемента группы, во всех файлах одинаковая, такая же как в выложенных образцах текста. ЗЫ Немного оптимизации в алгоритме (убрал привязку к последовательности элементов внутри группы, но первый и последний элемент, должны присутствовать всегда) плюс косметика в оформлении... поправил. | Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 07:14 01-10-2018 | Исправлено: YuS_2, 08:33 01-10-2018 |
|