Skrypt przeszukujacy dwa pliki tekstowe i dopisujacy zadane znaki do drugiego pliku
Pukas - 28-06-2006 01:15
Skrypt przeszukujacy dwa pliki tekstowe i dopisujacy zadane znaki do drugiego pliku
Dzień dobry Chciałem podziękować za pomoc w pisaniu tego skryptu, bez was nie dal bym rady pewnie tego napisać( dokładny opis:
http://groups.google.pl/group/pl.com...c80e67a455e9a4
). Niestety teraz musze zmodyfikować istniejący skrypt tak aby czytał dwa pliki i jeden z nich modyfikował, a miało by to wyglądać tak : operacje są dokonywane na dwóch plikach tekstowych, pierwszy z nich jest plikiem tylko do odczytu i wygląda tak :
1 1 -2.5930E+08 -1.1393E+07 -2.9221E+07 -1.5604E+07 -3.0836E+06 2.6169E+08 2 1 -1.5113E+08 -5.3081E+06 -6.7720E+07 -7.9690E+06 -7.1801E+06 1.9560E+08 3 1 -6.1180E+07 -7.6683E+05 -9.4798E+07 -2.5004E+06 -1.0760E+07 1.8449E+08 4 1 4.4102E+07 9.0110E+06 -7.9293E+07 2.6747E+06 -1.0032E+07 1.4468E+08 5 1 1.2766E+08 7.3496E+06 -7.5612E+07 8.8286E+06 -1.2019E+07 1.7172E+08 6 1 3.4349E+08 6.2426E+07 1.6234E+07 2.0982E+07 3.7429E+06 2.4794E+08
pierwsza liczba w każdej linijce to liczbą porządkową następne to parametry, ostatnia to liczna na podstawie której program ma ocenić co zrobić z linijka o TYM SAMYM numerze na w drugim pliku tekstowym ..Drugi plik wygląda tak prawie identycznie jak pierwszy, ma tyle samo linijek i 9 kolumn
1, 93, 297, 20, 1, 1424, 1628, 1351, 1332 2, 297, 298, 21, 20, 1628, 1629, 1352, 1351 3, 298, 299, 22, 21, 1629, 1630, 1353, 1352 4, 299, 300, 23, 22, 1630, 1631, 1354, 1353 5, 300, 301, 24, 23, 1631, 1632, 1355, 1354 6, 301, 302, 25, 24, 1632, 1633, 1356, 1355
Operacja wykonywana przez skrypt ma polegać na odczycie z pierwszego pliku liczy porządkowej i porównaniu jej z wcześniej podanym parametrem X ( równym np. X=1,2,4,6) jeśli X jest różne od liczby porządkowej to należy sprawdzić ostatnia liczbę w linijce i porównać ja z Y ( Y ma jedna wartość i jest równe np. Y=1.717E+08), jeśli liczba ta jest większa od Y to skrypt powinien wprowadzić zmianę w linijce o tym samym numerze w pliku numer dwa - zmiana to wstawienie ** na początku linii, tak ze efekt końcowy powinien wyglądać tak : (plik numer 2) 1, 93, 297, 20, 1, 1424, 1628, 1351, 1332 ** 2, 297, 298, 21, 20, 1628, 1629, 1352, 1351 3, 298, 299, 22, 21, 1629, 1630, 1353, 1352 4, 299, 300, 23, 22, 1630, 1631, 1354, 1353 ** 5, 300, 301, 24, 23, 1631, 1632, 1355, 1354 6, 301, 302, 25, 24, 1632, 1633, 1356, 1355 plik numer 1 pozostaje niezmieniony Wiem ze problem jest skomplikowany(przynajmniej dla mnie), w książkach i kursach internetowych nie znalazłem nic co choćby przypominało podobny problem .Szukałem tez na forach podobnych rozwiązań, niestety bez efektu. Jak do tej pory próbuje przekształcić skrypt napisany przez pana Michała Kurka w odpowiedzi na mój poprzedni list. Czy ktoś byłby w stanie pomoc mi w napisaniu takiego skryptu ?Albo chociaż naprowadzić na właściwe rozwiązanie ?
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 28-06-2006 01:15
Pukas wrote:
> Wiem ze problem jest skomplikowany(przynajmniej dla mnie), w > książkach i kursach internetowych nie znalazłem nic co choćby > przypominało podobny problem .Szukałem tez na forach podobnych > rozwiązań, niestety bez efektu. Jak do tej pory próbuje > przekształcić skrypt napisany przez pana Michała Kurka w odpowiedzi > na mój poprzedni list. > Czy ktoś byłby w stanie pomoc mi w napisaniu takiego skryptu ?Albo > chociaż naprowadzić na właściwe rozwiązanie ?
Wczytaj pierwszy plik i do hasha lub tablicy o lp jako kluczu/indeksie zapisz informacje czy maja być dopisane ** dla danej lp (z tego co zrozumiałem, warunki mają być sprawdzane tylko na danych z pierwszego pliku i zewnętrznych parametrów), wczytuj drugi linia po linii, sprawdzaj czy ma dodać **, wynik zapisuj do TRZECIEGO plik. Skopiuj plik trzeci na drugi.
-- P.M.
Pukas - 29-06-2006 00:44
> Wczytaj pierwszy plik i do hasha lub tablicy o lp jako kluczu/indeksie > zapisz informacje czy maja być dopisane ** dla danej lp (z tego co > zrozumiałem, warunki mają być sprawdzane tylko na danych z pierwszego > pliku i zewnętrznych parametrów), wczytuj drugi linia po linii, > sprawdzaj czy ma dodać **, wynik zapisuj do TRZECIEGO plik. Skopiuj plik > trzeci na drugi.
Hmm, niestety nie wiem jak napisac taki skrypt, jestem zielony w perlu, tzn. prostrze rzeczy potrafie zrobic ale to jest troche za skomplikowane, narazie mam tylko lekko zmodyfikowany pierwszy skrypt:
#wprowadzam zmienne X
#print 'zaladowalem plik z numerami wezlow'; open(wezly, 'wezly.txt') || die "brak pliku z wezlami";
@wezly = <wezly>;
#wprowadzam druga zeminna Y
print 'podaj wartosc parametru misessa:'; $misess =<STDIN>;
open(IN,'in.txt') || die "$!\n"; open(OUT,'>'.'out.txt') || die "$!\n";
while (<IN>) { my $line = $_; s/\s+//g; my @line = split(/,/,$_);
#print "$line[0]\n"; #print "$line[2]\n";
# tutaj warunki z X i Y :) # jezeli spelnione to to wypisujemy gwiazdki if(!grep($line[0]==$_, @wezly) && $line[8]>$misess) {
print OUT "**".$line;}
else{ print OUT $line; }
}
close(IN); close(OUT); close(wezly);
wiesz moze jak to zmodyfikowac ?
Pukas - 29-06-2006 00:44
hmm, kombinuje juz jak przyslowiowy koń pod górke... nie wiem co zle robie ale skrypt nie dziala jak powinien ... prosze... pomocy:-)
Pukas - 04-07-2006 00:59
hmm a jak podzielic taka linie na kolumny skoro nie ma przecinkow ? 1 1 -2.5930E+08 2.7504E+06 -1.1393E+07 -2.9221E+07 -1.5604E+07 -3.0836E+06 2.6169E+08
=?ISO-8859-2?Q?=A3ukasz_M=B1drzycki?= - 04-07-2006 00:59
Pukas napisał(a): > hmm a jak podzielic taka linie na kolumny skoro nie ma przecinkow ? > 1 1 -2.5930E+08 2.7504E+06 -1.1393E+07 -2.9221E+07 > -1.5604E+07 -3.0836E+06 2.6169E+08
my $linia ='1 1 -2.5930E+08 2.7504E+06 -1.1393E+07 -2.9221E+07 -1.5604E+07 -3.0836E+06 2.6169E+08'; my @czesci = split / +/, $linia;
przy założeniu, ze $linia to jeden ciąg, bez przełamania linii.
pzdr, luk
-- *- uksza(@)at(@)wp(.)dot(.)pl *- RLU: #272802 | got slack?
Pukas - 04-07-2006 00:59
probowalem zrobic cos takiego , aby czytal 2 pliki w tym samym czasie , czy to jest mozliwe ? bo zrobione w ten sposob nie dziala
while (<IN>) { my $line = $_; s/\s+//g; my @line = split(/,/,$_);
#print "$line[0]\n"; #print "$line[2]\n";
while(<drop>){ my $liness = $_; s/\s+/,/g; my @liness = split(/,/,$_);}
# tutaj warunki z X i Y :) # jezeli spelnione to to wypisujemy gwiazdki if(!grep($line[0]==$_, @wezly) && $liness[8]>$misess) {
print OUT "**".$line; print OUT ".".$liness[3];
Maciej Misiak - 04-07-2006 00:59
Łukasz Mądrzycki wrote: > my @czesci = split / +/, $linia;
@czesci = split / /, $linia; zadziała tak samo, ponieważ albowiem dlatego że / / w split działa jak... yyy... wielospacja.
-- grizzley
Maciej Misiak - 04-07-2006 00:59
Pukas wrote: > probowalem zrobic cos takiego , aby czytal 2 pliki w tym samym czasie , > czy to jest mozliwe ? > bo zrobione w ten sposob nie dziala > > while (<IN>) { > my $line = $_; > s/\s+//g; > my @line = split(/,/,$_); > > > #print "$line[0]\n"; > #print "$line[2]\n";
A ustaw no pozycję w pliku reprezentowanym przez drop na 0 w tym miejscu i zobacz czy zadziała.
> while(<drop>){
-- grizzley
Pukas - 04-07-2006 00:59
> A ustaw no pozycję w pliku reprezentowanym przez drop na 0 w tym miejscu > i zobacz czy zadziała. > > > while(<drop>){ > > > -- > grizzley
hmm dalej zadnego efektu, wie ktos moze czy wogule da sie zrobic cos takiego jak w temacie ?????? nie wiem juz ile nad tym siedze, nie wiem czy to wogole zadziala :-/
Szymon =?iso-8859-2?Q?Sok=F3=B3?= - 04-07-2006 00:59
On Mon, 03 Jul 2006 17:07:19 +0200, Maciej Misiak wrote:
> Łukasz Mądrzycki wrote: >> my @czesci = split / +/, $linia; > > @czesci = split / /, $linia; > zadziała tak samo, ponieważ albowiem dlatego że / / w split działa > jak... yyy... wielospacja.
Nieprawdą jest, jakoby. split ' ', $linia tak zadziała. Natomiast split / /, $linia nie.
As a special case, specifying a PATTERN of space (' ') will split on white space just as "split" with no arguments does. Thus, "split(' ')" can be used to emulate awk's default behav- ior, whereas "split(/ /)" will give you as many null initial fields as there are leading spaces. A "split" on "/\s+/" is like a "split(' ')" except that any leading whitespace produces a null first field.
-- Szymon Sokół (SS316-RIPE) -- Network Manager B Computer Center, AGH - University of Science and Technology, Cracow, Poland O http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F Free speech includes the right not to listen, if not interested -- Heinlein H
Pukas - 04-07-2006 00:59
aha ten segment troche sie rozjechal i powinien wygladac tak : > 1 1 -2.5930E+08 -1.1393E+07 -2.9221E+07 -1.5604E+07 -3.0836E+06 2.6169E+08 > 2 1 -1.5113E+08 -5.3081E+06 -6.7720E+07 -7.9690E+06 -7.1801E+06 1.9560E+08 > 3 1 -6.1180E+07 -7.6683E+05 -9.4798E+07 -2.5004E+06 -1.0760E+07 1.8449E+08 > 4 1 4.4102E+07 9.0110E+06 -7.9293E+07 2.6747E+06 -1.0032E+07 1.4468E+08 > 5 1 1.2766E+08 7.3496E+06 -7.5612E+07 8.8286E+06 -1.2019E+07 1.7172E+08 > 6 1 3.4349E+08 6.2426E+07 1.6234E+07 2.0982E+07 3.7429E+06 2.4794E+08 oczywiscie wszystkie te liczby sa ulozone w kolumny
Maciej Misiak - 05-07-2006 01:12
> On Mon, 03 Jul 2006 17:07:19 +0200, Maciej Misiak wrote: > > > Łukasz Mądrzycki wrote: > >> my @czesci = split / +/, $linia; > > > > @czesci = split / /, $linia; > > zadziała tak samo, ponieważ albowiem dlatego że / / w split działa > > jak... yyy... wielospacja. > > Nieprawdą jest, jakoby. > split ' ', $linia tak zadziała. Natomiast split / /, $linia nie.
Racja.
-- grizzley
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Pukas - 05-07-2006 01:12
Ok tqm polecil mi takie rozwiazenie tego problemu : #!/usr/bin/perl -Tw use strict; use vars qw/%test %modify $Y/;
# usage if ($#ARGV < 2) { print "Usage:\n\t wezly.pl <in-tested.txt> <in-changed.txt> <nodes-skip.txt>\n"; exit 0; }
# load data if (open (FH, $ARGV[0])) { while (<FH>) { chomp; next if (!/^\d/); my @tmp = split(/\s+/); $test{$tmp[0]} = $tmp[$#tmp]; } close (FH); } else { die "Can't open file $ARGV[0]: $!\n"; }
if (open (FH, $ARGV[1])) { while (<FH>) { chomp; next if (!/^\d/); m/^(\d+)/; $modify{$1} = $_; } close (FH); } else { die "Can't open file $ARGV[1]: $!\n"; }
if (open (FH, $ARGV[2])) { while (<FH>) { chomp; next if (!/^\d$/); delete $test{$_}; } close (FH); } else { die "Can't open file $ARGV[2]: $!\n"; }
# get Y print "Y = "; chomp(my $Y=<STDIN>);
# do testing on what has left after loading nodes list foreach my $node (keys %test) { $test{$node} > $Y ? $modify{$node} = '** ' . $modify{$node} : undef; }
# print results to STDOUT (yup! be flexible and redy to be redirected!) open (FH, '>wezly-out.txt') || die "Can't open output file: $!\n"; foreach my $node (sort keys %modify) { print FH "$modify{$node}\n"; } close (FH);
hmm, nic z tego nie rozumiem , wiem tylko ze pod win xp nie dziala , moze ktos mi poradzic dlaczego ?
Maciej Misiak - 06-07-2006 01:02
> > hmm, nic z tego nie rozumiem , wiem tylko ze pod win xp nie dziala , > moze ktos mi poradzic dlaczego ?
Mi działa.
-- grizzley
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Pukas - 06-07-2006 01:02
Maciej Misiak napisał(a): > > > > hmm, nic z tego nie rozumiem , wiem tylko ze pod win xp nie dziala , > > moze ktos mi poradzic dlaczego ? > > Mi działa. > > -- > grizzley
ciekawe gdzie ja robie blad , albo w czym tkwi roznica
grizzley@op.pl - 06-07-2006 01:02
> > Mi działa. > > ciekawe gdzie ja robie blad , albo w czym tkwi roznica
Ja zrobiłem tak: skopiowałem kod programu do pliku s.pl, potem dane wejściowe --- poczatek 1 1 -2.5930E+08 -1.1393E+07 -2.9221E+07 -1.5604E+07 -3.0836E+06 2.6169E+08 2 1 -1.5113E+08 -5.3081E+06 -6.7720E+07 -7.9690E+06 -7.1801E+06 1.9560E+08 3 1 -6.1180E+07 -7.6683E+05 -9.4798E+07 -2.5004E+06 -1.0760E+07 1.8449E+08 4 1 4.4102E+07 9.0110E+06 -7.9293E+07 2.6747E+06 -1.0032E+07 1.4468E+08 5 1 1.2766E+08 7.3496E+06 -7.5612E+07 8.8286E+06 -1.2019E+07 1.7172E+08 6 1 3.4349E+08 6.2426E+07 1.6234E+07 2.0982E+07 3.7429E+06 2.4794E+08 --- koniec do pliku a.txt
--- poczatek 1, 93, 297, 20, 1, 1424, 1628, 1351, 1332 2, 297, 298, 21, 20, 1628, 1629, 1352, 1351 3, 298, 299, 22, 21, 1629, 1630, 1353, 1352 4, 299, 300, 23, 22, 1630, 1631, 1354, 1353 5, 300, 301, 24, 23, 1631, 1632, 1355, 1354 6, 301, 302, 25, 24, 1632, 1633, 1356, 1355 --- koniec do pliku b.txt
oraz --- poczatek 6 --- koniec
do pliku c.txt i uruchomiłem tak:
c:\scripts>s.pl a.txt b.txt c.txt "-T" is on the #! line, it must also be used on the command line at c:\scripts\p ukas\s.pl line 1.
c:\scripts>perl -T s.pl a.txt b.txt c.txt Y = 2.0E+08
c:\scripts>
Wynik: --- poczatek ** 1, 93, 297, 20, 1, 1424, 1628, 1351, 1332 2, 297, 298, 21, 20, 1628, 1629, 1352, 1351 3, 298, 299, 22, 21, 1629, 1630, 1353, 1352 4, 299, 300, 23, 22, 1630, 1631, 1354, 1353 5, 300, 301, 24, 23, 1631, 1632, 1355, 1354 6, 301, 302, 25, 24, 1632, 1633, 1356, 1355 --- koniec
-- grizzley
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Skrypt fotka.pl/sympatia.pl
Skrypt na backup (MSSQL2000) i restore (MSSQL2005)
=?ISO-8859-2?Q?[Oracle]_Wywo=B3anie_skryptu_sh_z_PL/SQL-a=3F=3F?=
używam czcionki wielkości 1296 pt na pliku o wielkości 800x600
potrzebny skrypt do wysylania faktury pro-forma na adres klienta kto zrobi?
=?iso-8859-2?q?Pro=B6ba_o_konwersj=EA_pliku_CDR_do_wersji_11_ lub_ni=BFszej?=
[MySQL]: Odzyskanie z pliku zawierającego wiele baz danych tylko jednej wybranej bazy
[Sprzedam] Zaawansowany skrypt do obsługi płatnych reklam za SMS
poszukuje skryptu dzialajacego jak www.centrum-modelek.pl
migracja skryptu SQL z Interbase do MSSQL 2005 Exp.
zanotowane.pldoc.pisz.plpdf.pisz.pltejsza.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|