Schrift
[thread]12037[/thread]

Problem beim zeilenweisen Einlesen einer Datei in ein Array ! (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
cherished
 2008-06-18 16:15
#111199 #111199
User since
2008-06-18
31 Artikel
BenutzerIn
[default_avatar]
renee+2008-06-18 14:11:32--
Stringvergleiche werden mit eq gemacht...


hehe jo kurz vorher entdeckt
problem jetzt ist das der immer nur die erste id nimmt aber dann irgendwie die erete while schleife nicht mehr weitermacht, also er sollte ja dann in a.txt die nächste zeile nehmen zum vergleichen, macht er aber nicht.
renee
 2008-06-18 16:15
#111200 #111200
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du willst mehrere Spalten miteinander vergleichen. So wie Du es beschrieben hast, musst Du keine Spalten vergleichen, sondern ganze Zeilen...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $file_a = 'a.txt';
my $file_b = 'b.txt';

tie my @b_lines, 'Tie::File', $file_b or die $!;
open my $fh, '<', $file_a or die $!;

while( my $zeile = <$fh> ){
    if( grep{ $_ eq $zeile }@b_lines ){
        print "Zeile [$zeile] sowohl in $file_a als auch in $file_b vorhanden\n";
    }
    else{
        print "Zeile [$zeile] nur in $file_a vorhanden\n";
    }
}
close $fh;
untie @b_lines;
(ungetestet)
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/
cherished
 2008-06-18 16:20
#111204 #111204
User since
2008-06-18
31 Artikel
BenutzerIn
[default_avatar]
ich muss das so machen :
ich nehme die erste ID von a.txt suche diese in der b.txt und muss dann Spalte 1 von a.txt mit spalte 1 von b.txt vergleichen sind die gleich dann die 2 spalte etc.pp. jenachdem wie viel halt dahinter sind.
renee
 2008-06-18 16:26
#111206 #111206
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
cherished+2008-06-18 14:20:55--
ich muss das so machen :
ich nehme die erste ID von a.txt suche diese in der b.txt und muss dann Spalte 1 von a.txt mit spalte 1 von b.txt vergleichen sind die gleich dann die 2 spalte etc.pp. jenachdem wie viel halt dahinter sind.
Ist das ne Hausaufgabe, in der das so geforder ist? Weil:

Du hast 4 Spalten. Wie Du es beschrieben hast:
Code: (dl )
1
2
3
4
5
  Vergleiche Spalte1
Wenn gleich, dann vergleiche Spalte2
Wenn gleich, dann vergleiche Spalte 3
Wenn gleich, dann vergleiche Spalte 4
Wenn gleich, dann gibt "toll" aus


dann kannst du gleich zeilenweise vergleichen, weil damit implizit auch die Spalten verglichen werden!
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/
cherished
 2008-06-18 16:31
#111208 #111208
User since
2008-06-18
31 Artikel
BenutzerIn
[default_avatar]
nene ich bin inna ausbildung als FI SI aber im mom in der AE abteilung und reiß mir den ar*** auf auch hier gut zu sein. kann aber ienfahc nur php und html und assembler... und gurndalgen c und c++ und vba.
perl ist neuland.

es geht darum:
in beiden .txt Dateien sind Daten. wie folgt:

a.txt
10_01;23;22364;29864
10_02;24;22365;29865
10_03;25;22366;29866
10_04;27;22367;29868
10_05;23;22323;29834
10_06;28;2231264;21219864
10_07;25;23442364;23229864
10_08;24;222364;3329864
10_09;23;22364;2986423
10_10;26;22364;29864;123;2323
10_11;23;22364;29864
10_12;24;22365;29865
10_13;25;22366;29866
10_14;27;22367;29868;2323
10_15;23;22323;29834
10_16;28;2231264;21219864
10_17;25;23442364;23229864
10_18;24;222364;3329864
10_19;23;22364;2986423
10_20;26;22364;29864

b.txt
10_08;24;222364;3329864
10_02;24;22365;29865
10_14;27;22767;29768
10_15;23;22323;29834
10_16;27;2231264;21219864
10_17;25;23442364;23229864
10_04;27;22367;29868
10_18;24;222764;3529864
10_19;21;22364;2986423
10_20;26;22364;2964
10_03;21;224366;29866
10_05;23;22323;29834
10_06;28;2231264;21219864
10_07;25;2342364;23229864
10_09;23;22364;2986423
10_10;26;22364;2964;1212;1213
10_11;22;22364;29864
10_01;23;22364;29864
10_13;25;22366;29866
10_12;24;22365;29865

ich nehme ID1 aus a.txt und such die in der b.txt.
Dann vergleiche ich spalte 1 von beiden und 2 und 3 ... bis n (ist nur ein BEIPSIEL hier in real kann es auch mehrere geben)
Wenn alle gleich sind ist alles i.O. und dann geb ich das in einer xtra Datei aus aber das ist kein prob das kriege ich hin.
renee
 2008-06-18 17:17
#111215 #111215
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du hast - glaube ich - nicht so ganz verstanden, worauf ich hinaus will.

Hier mal zwei Versionen:

(Vergleich aller Spalten)
Code (perl): (dl )
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
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $file_a = 'a.txt';
my $file_b = 'b.txt';

tie my @b_lines, 'Tie::File', $file_b or die $!;
open my $fh, '<', $file_a or die $!;

while( my $zeile = <$fh> ){
   chomp $zeile;
   my @spalten = split /;/, $zeile;
   ZEILE: for my $zeile_b ( @b_lines ){
      my @spalten_b = split /;/, $zeile_b;
      
      if( @spalten == @spalten_b ){
         for ( 0..$#spalten ){
            next ZEILE unless $spalten[$_] eq $spalten_b[$_];
         }
         print "Alles klar: $zeile\n";
      }
   }
}

close $fh;
untie @b_lines;


(Ausgabe)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
C:\Perl>compare.pl
Alles klar: 10_01;23;22364;29864
Alles klar: 10_02;24;22365;29865
Alles klar: 10_04;27;22367;29868
Alles klar: 10_05;23;22323;29834
Alles klar: 10_06;28;2231264;21219864
Alles klar: 10_08;24;222364;3329864
Alles klar: 10_09;23;22364;2986423
Alles klar: 10_12;24;22365;29865
Alles klar: 10_13;25;22366;29866
Alles klar: 10_15;23;22323;29834
Alles klar: 10_17;25;23442364;23229864


(Vergleich komplette Zeile)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $file_a = 'a.txt';
my $file_b = 'b.txt';

tie my @b_lines, 'Tie::File', $file_b or die $!;
open my $fh, '<', $file_a or die $!;

while( my $zeile = <$fh> ){
   chomp $zeile;
    if( grep{ $_ eq $zeile }@b_lines ){
        print "Alles klar: $zeile\n";
    }
}

close $fh;
untie @b_lines;


(Ausgabe)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
C:\Perl>compare2.pl
Alles klar: 10_01;23;22364;29864
Alles klar: 10_02;24;22365;29865
Alles klar: 10_04;27;22367;29868
Alles klar: 10_05;23;22323;29834
Alles klar: 10_06;28;2231264;21219864
Alles klar: 10_08;24;222364;3329864
Alles klar: 10_09;23;22364;2986423
Alles klar: 10_12;24;22365;29865
Alles klar: 10_13;25;22366;29866
Alles klar: 10_15;23;22323;29834
Alles klar: 10_17;25;23442364;23229864


Jetzt klar, dass Du auch gleich die komplette Zeile vergleichen kannst, wenn Du sowieso alle Spalten durchgehen willst?

Edit:

Oder etwas anders ausgedrück. Stell Dir vor, Du hast in jeder Zeile nicht diese Zahlen, sondern einfach 'abcd' stehen (in a.txt und b.txt). So wie Du es beschrieben hast, willst Du 'abcd' in 'a','b','c','d' teilen und dann 'a' mit 'a' vergleichen. Wenn das gleich ist, vergleichst Du 'b' mit 'b', 'c' mit 'c' und 'd' mit 'd'. Da kannst Du gleich 'abcd' mit 'abcd' vergleichen, weil dann implizit 'a' mit 'a', 'b' mit 'b', 'c' mit 'c' und 'd' mit 'd' verglichen ist...
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/
cherished
 2008-06-18 17:28
#111219 #111219
User since
2008-06-18
31 Artikel
BenutzerIn
[default_avatar]
oh bin ich panne sorry ...
also ich muss die werte einzeln vergleichen ...
also jeden wert (nach der ID ).
ID 1 , wert 1 von a.txt mit wert1 von b.txt => gleich oder ungleich
wert 2 von a.txt mit wert2 von b.txt => gleich oder ungleich
wert 3 von a.txt mit wert3 von b.txt => gleich oder ungleich
bis n
renee
 2008-06-18 17:30
#111221 #111221
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Naja, die Lösung habe ich ja schon gepostet ;-)
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/
cherished
 2008-06-19 11:52
#111254 #111254
User since
2008-06-18
31 Artikel
BenutzerIn
[default_avatar]
Kurze Frage mal wieder.
Wieso läuft mein Programm die 2 schleife nur 1 mal durch
?
Code: (dl )
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
my $i=0;
my $solldatei = 'a.txt';
my $istdatei = 'b.txt';

open my $filehandle, '<', $solldatei;
open my $filehandle1, '<', $istdatei;


while( my $ziele = <$filehandle> )

{
@test = split(/;/, $ziele);
while( my $ziele1 = <$filehandle1>)
{
@test1 = split(/;/, $ziele1);
print @test[0];
print " @test1[0] \n";
if(@test[0]eq@test1[0])
{
print "@test[0]";
print " und";
print " @test1[0]";
print " COOL!\n";
}
}
}


close $filehandle;
close $filehandle1;

//ModEdit GwenDragon: Bitte Code das nächste Mal in CODE- oder PERL-Tags stellen.

muss ich iwo den Cursor wieder auf top setzten oder die Datei neu öffnen oder so ?
Linuxer
 2008-06-19 13:28
#111256 #111256
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
While der interne Pointer im handle $filehandle1 nach dem Durchlauf der while-Schleife am Ende angekommen ist und nicht zurückgesetzt wird.

perldoc -f seek
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2008-06-18 13:29.