Форум программистов, компьютерный форум, киберфорум
Perl
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
2 / 2 / 0
Регистрация: 28.01.2014
Сообщений: 210
1

Считывание пути из файла

07.02.2014, 17:49. Показов 2412. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста написать команду на языке perl

Необходимо создать команду, чтобы из одного определенного файла, например, rel.ism в блоке name, строка содержащая слово mac считывал путь из этого же файла, но из другого блока dir.

Пример:

Блок name <row>F_Mac</td><td>{D2646DF0-E891-4645-9443-1ABE1247DAA8}</td><td>CC_MAC</td><td>

Блок dir

<row><td>CC_Mac</td><td>&ltynamicRoot&gt; Тут начинается путь \cadr\mac</td><td>3

Итог:

\cadr\mac
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2014, 17:49
Ответы с готовыми решениями:

Считывание расположения (пути) файла с клавиатуры
Нужно реализовать в консольной программе открытие файла, путь которого будет считан с клавиатуры....

Считывание и запись по пути с реестра
Всем привет,столкнулся с такой проблемкой,принцып таков: происходит запуск приложения с...

Заменить считывание с клавиатуры на считывание из файла
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что...

Нужно произвести считывание пути к файлу с клавиатуры. Причём сделать это в конструкторе. Всё остальное корректно работает.
Заранее благодарен всем кто поможет. Здравстуйте, была полностью рабочая программа которая...

34
2 / 2 / 0
Регистрация: 28.01.2014
Сообщений: 210
17.02.2014, 10:01  [ТС] 21
Author24 — интернет-сервис помощи студентам
Спасибо большое!!!!!

Добавлено через 9 минут
Только это совсем немного не то)
0
79 / 79 / 15
Регистрация: 24.11.2010
Сообщений: 515
Записей в блоге: 14
17.02.2014, 10:10 22
А по конкретней? что совсем немного не то программа делает?
0
2 / 2 / 0
Регистрация: 28.01.2014
Сообщений: 210
17.02.2014, 11:42  [ТС] 23
сначала нужна команда открытия файла 1.ism
Потом Поиск <table name="Directory">, отсюда поиск строк содержащие SVDIRMAC. Здесь указываются название папки где находится SVDIRMAC, например, строка <row><td>BSM</td><td>SVDIRMAC</td><td>Bsm</td><td/><td>0</td><td/></row> Отсюда мы берем название папки BSM
Потом поиск прекращается
Далее поиск Блока ISDynamicFile. Тут находим уже название самой папки BSM и отсюда уже необходимо вывести путь к этой папке, например, <row><td>Bsm_Mac</td><td>&ltynamicLinkRoot&gt;\bsm\mac</td><td>1</td><td>*.*</td><td/><td>0</td></row>
Итог должен быть: Список путей к папке:
В примере
\bsm\mac
0
79 / 79 / 15
Регистрация: 24.11.2010
Сообщений: 515
Записей в блоге: 14
17.02.2014, 12:52 24
Лучший ответ Сообщение было отмечено Olich666 как решение

Решение

Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/perl
 
use strict;
#Открываем файл в переменную file
open(my $file,"1.ism") or die("Error open 1.ism");
#записываем файл в массив str, чтобы бегать построчно
my @str = <$file>;
my $len = @str;
my @arr;
my $i=0;
while($str[$i] !~ /"ISDynamicFile"/)
{
        #Здесь ставите одну проверку и получаете конфетку
        if($str[$i] =~ /SVDIRMAC/)
        {
                  $str[$i] =~ /<row><td>(\w+)<\/td>/;
                  push @arr, $1   if($1 && $1 !~ /\n/ && $1 !~ /\r/ && $1 !~ / /);
        }
        $i++;
}
 
close $file;
my $l = @arr;
my $y=0;
open (my $road,"> pach.txt");
for(my $y=0;$y<$l;$y++)
{
        open(my $f,"1.txt");
        my @path=<$f>;
        my $count = @path;
        for(my $e=$i;$e<$count;$e++)
        {
                if($path[$e] =~ /\\$arr[$y]\\/i)
                {
                        $path[$e] =~ /gt;(.*?)</;
                         print $road $1, "\n";
                }
        }
        close $f;
}
 
close $road;
 
#Удаляем повторяющиеся пути
my %lines;
open(my $in,"pach.txt");
open(my $out,"> final.txt");
foreach (<$in>) {$lines{$_} = $_}
print $out keys %lines;
close $in;
close $out;
 
unlink("pach.txt");
1
2 / 2 / 0
Регистрация: 28.01.2014
Сообщений: 210
17.02.2014, 13:50  [ТС] 25
В итоге файл final.txt пустой...
0
79 / 79 / 15
Регистрация: 24.11.2010
Сообщений: 515
Записей в блоге: 14
17.02.2014, 14:04 26
Даже не знаю, чем тебе еще помочь! у меня все работает!
0
2 / 2 / 0
Регистрация: 28.01.2014
Сообщений: 210
17.02.2014, 14:16  [ТС] 27
А что у тебя получается в итоговом файле?
0
79 / 79 / 15
Регистрация: 24.11.2010
Сообщений: 515
Записей в блоге: 14
17.02.2014, 14:39 28
\reptcb\mac
\report\obj
\ifrs\mac
\cadr\obj
\loans\TemplsWord
\loans\obj
\invh\obj
\ReptReg\Obj
\invh\mac\common
\mbr\mac
\ps\vrslfile
\cb\templs
\loans\mac
\loans\TemplsExcel
\Cb\templs
\rm\obj
\rm\mac
\cb\mac_ms
\reptreg\mac
\bsm\mac
\cb\obj
\report\mac
\invh\obj\lvm
\cadr\mac
\ifrs\obj
\invh\obj\pchs
\loans\TemplsDepoExcel
\mbr\obj
\cb\mac
\bsm\obj
\invh\mac
\ps\mac
\ps\obj
\loans\TemplsDepo
0
2 / 2 / 0
Регистрация: 28.01.2014
Сообщений: 210
17.02.2014, 16:34  [ТС] 29
Все. Ура. Получилось. Спасибо большущее!!!
1
79 / 79 / 15
Регистрация: 24.11.2010
Сообщений: 515
Записей в блоге: 14
17.02.2014, 16:38 30
Рад, что смог помочь!)
0
2 / 2 / 0
Регистрация: 28.01.2014
Сообщений: 210
17.02.2014, 16:51  [ТС] 31
А подскажи пожалуйста последний момент.
Как можно просто считать название проекта, только из блока Directory, находя SVDIRMAC после </td><td> название проекта до символа до следующего </td>
Например:
тот же самый файл
<row><td>BSM</td><td>SVDIRMAC</td><td>Bsm<td/><td>0</td><td/></row>
Отсюда только название справа:

Bsm
0
79 / 79 / 15
Регистрация: 24.11.2010
Сообщений: 515
Записей в блоге: 14
17.02.2014, 16:56 32
Регуляркой, т.е. будет выглядеть примерно так
Perl
1
2
3
4
5
6
7
8
9
10
11
while($str[$i] !~ /"ISDynamicFile"/)
{
        #Здесь ставите одну проверку и получаете конфетку
        if($str[$i] =~ /SVDIRMAC/)
        {
                  #Здесь меняем <row> на </td> и получаем наше Bsm
                  $str[$i] =~ /<\/td><td>(\w+)<\/td>/;
                  push @arr, $1   if($1 && $1 !~ /\n/ && $1 !~ /\r/ && $1 !~ / /);
        }
        $i++;
}
1
2 / 2 / 0
Регистрация: 28.01.2014
Сообщений: 210
18.02.2014, 10:20  [ТС] 33
Итог получился:

while( ( $currec < $count ) && ( $lines[$currec] !~ '<table name="Directory">' ) )
{ $currec++; }
$currec++;

while( ( $currec < $count ) && ( $lines[$currec] !~ '</table>' ) )
{
if( $lines[$currec] =~ '<td>SVDIRMAC</td><td>(\w+)</td>' )
{
push( @date, $1 );
print( $1, "\n" );
}
$currec++;
}
$currec++;
$size = @date;

Как сделать вывод в xml формат?
0
79 / 79 / 15
Регистрация: 24.11.2010
Сообщений: 515
Записей в блоге: 14
18.02.2014, 10:25 34
Perl
1
2
3
open(my $file,"> file.xml");
print $file $data;
close $file;
1
5989 / 1998 / 323
Регистрация: 10.12.2013
Сообщений: 6,882
18.02.2014, 19:46 35
1C
1
2
поздравляем олимпийскую сборную россии по
хоккею с разгромом сборной норвегии со счётом 3:0
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/perl -w
use strict;
 
# CPAN-Perl-реализация библиотеки 
# libxml2 - [url]http://xmlsoft.org/[/url]
use XML::LibXML;
 
# исходный XML-файл-проект приложения InstallShield
my $ism_file = "rel.ism"; 
 
my $doc = XML::LibXML->new()->parse_file( $ism_file ); #ошибки обрабатывются внутри parse_file
 
# собрать в список ключевые слова, извлекаемые из каждого ряда <tr> из третьего по счёту тэга <td>,
# если во втором тэге <td> присутствует слово 'SVDIRMAC'
 
my @keywords
    =   map  { $_->findnodes('./td[3]')->to_literal }
        grep { $_->findnodes('./td[2]')->to_literal eq 'SVDIRMAC' }
        $doc->findnodes('//table[@name="Directory"]/row');
 
# из каждого ряда <tr> извлечь искомый путь из второго тэга <td>, если в первом тэге <td>
# присутствует в виде префикса ключевое слово из списка @keywords и
# распечатать
 
for my $row ( $doc->findnodes('//table[@name="ISDynamicFile"]/row') ) {
 
    my $td1
        = $row->findnodes('./td[1]')->to_literal; # содержимое 1-го <td>
    my ($td2)
        = $row->findnodes('./td[2]')->to_literal =~ / (\\ .+)\z /x; # 2-го          
    
    map  { print $td2, v10 }
    grep {  $td1 =~ m/ \A $_ /x }
    @keywords;
}
объяснение использованного синтаксиса XPath:

найти внутри тэга <table> с атрибутом name="Directory"
все тэги <row>
XML
1
//table[@name="Directory"]/row
найти внутри тэга <table> с атрибутом name="ISDynamicFile"
все тэги <row>
XML
1
//table[@name="ISDynamicFile"]/row
в текущем узле найти третий тэг <td>
XML
1
./td[3]
в текущем узле найти первый тэг <td>
XML
1
./td[1]
1
18.02.2014, 19:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2014, 19:46
Помогаю со студенческими работами здесь

Загрузка содержимого doc файла в RichTextBox по пути файла
Как вывести данный в RichTextBox с doc документа по его пути при нажатие кнопки?

Считывание файла в массив и запись нового файла
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и...

Считывание из файла
//считываем данные об услугах из файла in.open(&quot;ресурсы.txt&quot;); while(!in.eof()) ...

считывание с файла
помогите, пожалуйста, нужно считать с файла ряд целых чисел и переписать его куда-то чтобы потом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru