Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Mam skrypt .php który wyszukuje w pliku ciągu zaczynającego się od "Zaczynam tutaj" a kończącego się na "Tutaj koniec":
<?php $file = fopen("/home/dewu/wejscie.txt", "rb"); $contents = stream_get_contents($file); fclose($file); $start= strpos($contents, "Zaczynam tutaj"); $stop = strpos($contents,"Tutaj koniec")-$start; $cut = substr($contents, $start,$stop); echo $cut; ?>
Wynikiem jest jedna linia, ok 10k znaków w której pojawia się kilkakrotnie ciąg "dokument-$ID.html". Czy pomoglibyście mi przerobić ten krótki kod PHP na basha a w dodatku napisać jakiegoś while'a który wyłapie mi wszystkie wystąpienia dokument-$ID.html? ID jest zawsze czterocyfrowym ciągiem cyfr.
Z góry dzięki!
Offline
Musi być w bashu? W bashu będzie ciężko ale np perl to już chwila moment.
Offline
Perla kompletnie nie znam a chciałbym jeszcze w nim coś dorobić. Anyway, jak mozesz zapodac gotowca to postaram sie cos z nim zrobic.
Offline
winnetou@hordeum-vulgare ~/tmp $ cat jakis_plik 1 cos do ignorowania 2 cos do ignorowania 3 cos do ignorowania tu_zaczynamy 1 sekcja 1 2 sekcja 1 3 sekcja 1 4 sekcja 1 5 sekcja 1 6 sekcja 1 tu_konczymy 4 cos do ignorowania 5 cos do ignorowania 6 cos do ignorowania 7 cos do ignorowania 8 cos do ignorowania 9 cos do ignorowania tu_zaczynamy 11 sekcja 2 12 sekcja 2 13 sekcja 2 14 sekcja 2 15 sekcja 2 tu_konczymy cos do ignorowania cos do ignorowania cos do ignorowania
winnetou@hordeum-vulgare ~/tmp $ cat spliter.pl #!/usr/bin/perl use warnings; use strict; use Data::Dumper; my $plik_do_podzielenia = $ARGV[0]; #my @tablica_fragmentow; open(FH, '<', $plik_do_podzielenia); my $plik_jako_1_string = do {local $/; <FH> }; close (FH); my $poczatek = q{tu_zaczynamy}; my $koniec = q{tu_konczymy}; my @tablica_fragmentow = $plik_jako_1_string =~ m!$poczatek(.*?)$koniec!sg; print Dumper(\@tablica_fragmentow);
winnetou@hordeum-vulgare ~/tmp $ ./spliter.pl jakis_plik
$VAR1 = [
'
1 sekcja 1
2 sekcja 1
3 sekcja 1
4 sekcja 1
5 sekcja 1
6 sekcja 1
',
'
11 sekcja 2
12 sekcja 2
13 sekcja 2
14 sekcja 2
15 sekcja 2
'
];
W wyniku dostajesz tablice z poszczególnymi wyciankami od "tu_zaczynamy" do "tu_kończymy". Jeśli chcesz sobie wyświetlić np 2 element tablicy (czyli w przykładzie "* sekcja 2" to zamiast
print Dumper(\@tablica_fragmentow);
dajesz
print $tablica_fragmentow[1]
Proste jak budowa cepa ;) Potem możesz poszczególne fragmenty poddać dowolnej obróbce.
Offline
A co jeśli plik wygląda tak:
Sekcja 1 Jakiesblabla Tu Zaczynamy cos nieistotnego dok-ID.html znowu cos nieistotnego dok-ID.html dascxcxz.... dok-ID.html costam Tu konczymy cos tam jeszcze
Offline
Ehh to spróbuj... ;]
winnetou@hordeum-vulgare ~/tmp $ cat jakis_plik 1 cos do ignorowania 2 cos do ignorowania 3 cos do ignorowania tu_zaczynamy 1 sekcja 1 2 sekcja 1 3 sekcja 1 4 sekcja 1 5 sekcja 1 6 sekcja 1 tu_konczymy 4 cos do ignorowania 5 cos do ignorowania 6 cos do ignorowania 7 cos do ignorowania 8 cos do ignorowania 9 cos do ignorowania tu_zaczynamy 11 sekcja 2 12 sekcja 2 13 sekcja 2 14 sekcja 2 15 sekcja 2 tu_konczymy cos do ignorowania cos do ignorowania cos do ignorowania winnetou@hordeum-vulgare ~/tmp $ ./spliter.pl jakis_plik $VAR1 = [ ' 1 sekcja 1 2 sekcja 1 3 sekcja 1 4 sekcja 1 5 sekcja 1 6 sekcja 1 ', ' 11 sekcja 2 12 sekcja 2 13 sekcja 2 14 sekcja 2 15 sekcja 2 ' ];
Ciężko zapisać gotowy kod i odpalić na testowym pliku wejściowym? ;>
Offline
a to nie lepszy będzie python? jeden regexp (re.search) do wyciągnięcia fragmentu, drugi (re.findall) do wyciągnięcia ID... i po robocie...
Offline
tego perla dałoby się zapisać prościej, ale że kolega nie ogarnia to pisałem tak, aby było widać co jest co.
A python osobiście mi nie leży ;)
Offline
Jeżeli chodzi o wojenki Perl <=> Python, to w obu będzie to wyglądało mnie więcej identyczne, więc nie ma się co indyczyć.
Jeżeli natomiast ma to chodzić ultraszybko, to polecam C i Assemlera. :D
Offline
C wystarczy - jak dla mnie jest to świetny sposób pisania w asemblerze nie znając asemblera ;)
btw. perla nie lubię prawie tak jak javy :)
Offline
Hmm ;)
[img]http://spece.it/wp-content/uploads/2014/05/getStringFromObject.jpg[/img]
Offline
Time (s) | Query |
---|---|
0.00012 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00084 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.145.8.139' WHERE u.id=1 |
0.00072 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.145.8.139', 1732575534) |
0.00052 | SELECT * FROM punbb_online WHERE logged<1732575234 |
0.00059 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=27726 AND t.moved_to IS NULL |
0.00009 | SELECT search_for, replace_with FROM punbb_censoring |
0.00186 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=27726 ORDER BY p.id LIMIT 0,25 |
0.01072 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=27726 |
Total query time: 0.0155 s |