Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7180[/thread]

Dateien vergleich [PERL NEWBIE]



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
v0id
 2005-08-01 15:34
#56900 #56900
User since
2005-07-06
33 Artikel
BenutzerIn
[default_avatar]
Hi zamm,

hab da so meine Anfangsschwierigkeiten, würd mich freuen wenn ihr mir helfen könntet.

Also..

Die Aufgabe:
Es soll eine alte und eine neue Version einer Datei verglichen werden. Am ende soll eine Report Datei ausgegeben werden.
Die Dateien sollen in dem Sinne verglichen werden das etwas nur drangehangen werden durfte und nix mitten in der Datei.

Mein erster Ansatz:
Also ich wollte ersteinmal ermitteln wieviele Zeilen die Dateien jeweils enthalten.
Daraufhin würd ich gern Zeile für Zeile die beiden Dateien vergleichen.
Wenn nun jede Zeile bis zum schluss gleich war und erst nach der letzten Zeile der alten Datei eine änderung kommt, ist es ja OK und es wurde nur text angehangen.
Ist doch korrekt oder hab ich grad nen denkfehler?

Meine Bitte:
Könnt ihr mein Ansatz prüfen, wenn nötig ein alternativ Vorschlag machen und ein paar nützliche Befehle wären auch toll.

mfg

v0id
Crian
 2005-08-01 15:40
#56901 #56901
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Das klingt eigentlich plausibel. Aber warum willst Du sie erst zählen? Um ev. das Vergleichen sparen zu können?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
J-jayz-Z
 2005-08-01 15:46
#56902 #56902
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Schau mal hier, das hatten wir erst vor kurzem:
http://board.perl-community.de/cgi-bin....;t=1722
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
renee
 2005-08-01 15:49
#56903 #56903
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vielleicht kann man da auch was mit CPAN:Text::Diff machen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
v0id
 2005-08-01 16:01
#56904 #56904
User since
2005-07-06
33 Artikel
BenutzerIn
[default_avatar]
@J-jayz-Z
das beispiel hab ich auch bereits gelesen, aber ich darf ja nix löschen oder rauskopieren..
brauche in der Report datei ansich nur ein "text wurde angehangen" oder "text wurde verändert".

@Crian
ich möcht die Zeilen zählen nicht um mir das vergleichen zu sparen, nur um zu wissen wann die alte Datei zuende war, so das ich weiß das ab da an was z.b. angehängt wurde.

@renee
kenne mich mit CPAN glaub ich viel zu wenig aus
:(
renee
 2005-08-01 16:04
#56905 #56905
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So installiert man ein Modul
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2005-08-01 16:30
#56906 #56906
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
naja, das würd ich dann glaub ich so machen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;

open ALT, 'c:/mein/pfad/altedatei.txt' or die $!;
open NEU, 'c:/mein/pfad/neuedatei.txt' or die $!;

while (1) {
my $alt = <ALT>;
my $neu = <NEU>;

die "alte Datei länger als neue Datei" if defined $alt and not defined $neu;
die "neue Datei länger als alte Datei" if not defined $alt and defined $neu;
die "Dateien sind gleich" if not defined $alt and not defined $neu;
die "Dateien sind unterschiedlich" if $alt ne $neu;
}


(ungetestet)\n\n

<!--EDIT|Crian|1122901416-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2005-08-01 16:38
#56907 #56907
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wenn man genug RAM hat bzw. die dateien klein genug sind, dann kann man dateien auch "in einem rutsch" in ein array laden. das ist zwar meist speicherverschwendung, kann aber das vergleichen erleichtern.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
v0id
 2005-08-01 17:11
#56908 #56908
User since
2005-07-06
33 Artikel
BenutzerIn
[default_avatar]
@Crian
Versteh ich das richtig das der letztendlich lediglich die Länge Prüft und ob diese gleich sind?
Mein Problem ist ja das die neue Datei wahrscheinlich immer länger sein wird, die Frage ist nur an welcher Stelle die veränderung war. Wurde was nur ans ende drangehängt ist es OK, wurde was mitten drin verändert ist das Schlecht.
Genau das muss ich halt prüfen :-/

@Taulmarill
die dateien werden glaub ich recht groß sein, deswegn hat ich überlegt das zeile für zeile zu prüfen :rock:
renee
 2005-08-01 17:32
#56909 #56909
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;

open ALT, './altedatei.txt' or die $!;
open NEU, './neuedatei.txt' or die $!;

while (1) {
my $alt = <ALT>;
my $neu = <NEU>;

die "alte Datei länger als neue Datei (ab Zeile $.)" if defined $alt and not defined $neu;
die "neue Datei länger als alte Datei (ab Zeile $.)" if not defined $alt and defined $neu;
die "Dateien sind gleich" if not defined $alt and not defined $neu;
die "Dateien sind unterschiedlich in Zeile $." if $alt ne $neu;
}


alt:
Code: (dl )
1
2
3
1
2
3


neu:
Code: (dl )
1
2
3
4
5
1
2
3
4
5


Ausgabe:
Code: (dl )
1
2
~/entwicklung 109> perl diff_simple.pl 
neue Datei länger als alte Datei (ab Zeile 4) at diff_simple.pl line 13, <NEU> line 4.
\n\n

<!--EDIT|renee|1122903242-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2005-08-01 15:34.