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

Helfen mir bitte: vergleichen 2 text files



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Gast Gast
 2006-07-10 14:00
#67996 #67996
Würden sie so nett mir ein bisschen zu helfen. Es gibt 2 text files. Im ersten gibt es Sätze(jeder vor neuen Zeile) mit Interpunktionszeichnen und im zweitem befinden sich nur ein Teil dieser Sätze ohne Kommas, Punkte, Doppelpunkte e.t.c. Die Aufgabe ist diese 2 files zu vergleichen und danach löschen im ersten file diese Zeile die schon im zweiten existieren.
Ich bin sehr dankbar wenn sie mir bei dieser Code helfen oder dazu neue Ideen bringen:
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
#!/usr/bin/perl

use strict;
#use locale;

my %src=();
open (FILE1,'eng_text1.txt') or die ("Pruefen Sie bitte die Name.");
open (FILE2,'eng_text2.txt') or die ("Pruefen Sie bitte die Name.");

while(<FILE2>) {
chomp;
s/\s{2,}/ /go;
$src{$_}=1;
}

#close (FILE2);
my $dst;

while(<FILE1>) {
$dst=$_;
chomp;
lc;
s/[:punct:]//go;
s/\s{2,}/ /go;
print $dst unless ($src{$_});
}
#close(FILE1);
renee
 2006-07-10 14:11
#67997 #67997
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde es folgendermaßen machen:

Lies alles aus der ersten Datei (aus der die Sätze gelöscht werden sollen) in ein Hash (am besten mit CPAN:Tie::IxHash arbeiten) ein. Danach durch die zweite Datei gehen und überprüfen, ob zu dem Satz schon ein Eintrag im Hash existiert. Wenn ja, dann mit delete siehe perldoc -f delete) den Satz aus dem Hash löschen.

Danach kannst Du mit keys alle Sätze, die nicht in der zweiten Datei stehen bekommen...
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/
Gast Gast
 2006-07-10 16:56
#67998 #67998
Vielen dank für wertvolle Hilfe. Ich hatte auch änliches Idee, aber auf diese Grund, dass ich nicht so stark in PERL bin, war es für mich fast unerfüllbar. Darf ich bitte noch eine Frage an Sie stellen?
Leider bin ich nicht root an meinem Computer, so kann ich nicht Tei::IxHash libs installieren und meines Programm prüfen. Seien Sie so nett nächsten Code durchzushauen und zu sagen, Ihre Meinung nach, ob dort irgendwelcher Fehler gibt. Ist es ganz blöde oder gibt dort kleines Stück gesundes Sinnes?
Danke im voraus.
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
31
#!/usr/bin/perl

use strict;
use Tie::IxHash;

tie %hash1,%hash2,"Tie::IxHash,APP";

my %hash1=();

open(APP,"eng_test1.txt");
#open(NEG,'eng_test2.txt');

while(<APP>) {
chomp;
@keys=keys %hash1;
}
close (APP);

open(NEG,"eng_text2.txt");
while(<NEG>) {
chomp;
@keys=keys %hash2;
}
close(NEG);

open(OUT,">saetze_hash.txt")
my @not=();
foreach(keys %hash1){
push(@not,$_) unless exists $hash2{$_};
}
close(OUT);
renee
 2006-07-11 15:33
#67999 #67999
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das hier sollte klappen:
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
#!/usr/bin/perl

use strict;
use Tie::IxHash;

tie my %hash,"Tie::IxHash";

open(APP,'<',"eng_text1.txt") or die $!;
while(my $line = <APP>){
chomp $line;
$line =~ s/\s+/ /g;
$hash{$line} = 1;
}
close (APP);

open(NEG,'<',"eng_text2.txt") or die $!;
while(my $line = <NEG>) {
chomp $line;
$line =~ s/\s+/ /g;
$line =~ s/\p{IsPunct}//g;
if(exists $hash{$line}){
delete $hash{$line};
}
}
close(NEG);

open(OUT,">saetze_hash.txt") or die $!;
print OUT $_,"\n" for(keys %hash);
close(OUT) or die $!;
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/
havi
 2006-07-11 16:50
#68000 #68000
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
... oder ohne Modul.

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
31
#!/usr/bin/perl

use warnings;
use strict;

open(EIN, "<Eingabedatei.txt") or die $!;

my %pnr;

while(<EIN>) {
chomp;
my @f = split(/\t/);
$pnr{$f[0]} = 1;
} # while

close(EIN) or die $!;


open(EIN2, "<Eingabedatei2.txt") or die $!;
open(AUS, ">Ausgabedatei.txt") or die $!;

while(<EIN2>) {
my @satz = split(/\t/);
my $vergleich = $satz[0];
print AUS $_ if defined $pnr{$vergleich};
} # while

close(EIN) or die $!;
close(AUS) or die $!;

1;


Gruss,
havi
legine
 2006-07-11 18:12
#68001 #68001
User since
2006-06-30
32 Artikel
BenutzerIn
[default_avatar]
Hmm verstehe ich nicht.
Quote
chomp $line;
$line =~ s/\s+/ /g;
$hash{$line} = 1;


Also als erstes cuttet ihr das \n Okey.
Dann ersetzt du alle leerzeich durch ein leerzeichen. Und schreibst das in einen hasch.
Aber wo zum henker verschwinden
Code: (dl )
.,"!?
, etc?

Bei der Zeile $line =~ s/\p{IsPunct}//g; sagt mir gar nichts.
Was ist denn \p?

Am meisten fällt mir auf das du dann ne Zeile zu Zeile vergleich durchführst.
if(exists $hash{$line}){
delete $hash{$line};

Aber in der Liste kann ja nur ein Teilstück drinn stehen. Das würde auf den Hash doch dann nicht matchen
Oder, verstehe ich hier was falsch?

Ich würde irgendwie eine Abfrage ala
$lineDat1 =~ /$lineDat2/ erwarten...

Oder bin ich in der Falschen Galaxsis?

Havis antwort ist genauso unklar.
Warum splittest du an \t?
Warum überhaupt die zeile Splitten?
Gast Gast
 2006-07-11 18:24
#68002 #68002
Vielen dank!!!
Und können Sie bitte noch eine Antwort geben: wenn ich einen beschtimmten Schlüssel im Hash habe (mit irgendwelcher Bedienung) - so im Dokument heisst das eine bestimmte Zeile - kann ich irgendwie die vorhergehende Zeile "print"?
renee
 2006-07-12 10:46
#68003 #68003
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@legine: Bei der einen Datei braucht man keine Interpunktion zu entfernen, da - laut kira - in der einen Datei die Sätze ohne Interpunktion gespeichert sind.

Zu der Zeile $line =~ s/\p{IsPunct}//g; steht einiges in perlre:

Quote
The following equivalences to Unicode \p{} constructs and equivalent backslash character classes (if available), will hold:

[:...:] \p{...} backslash

alpha IsAlpha
alnum IsAlnum
ascii IsASCII
blank IsSpace
cntrl IsCntrl
digit IsDigit \d
graph IsGraph
lower IsLower
print IsPrint
punct IsPunct
space IsSpace
IsSpacePerl \s
upper IsUpper
word IsWord
xdigit IsXDigit


Und punct ist:
Quote
punct

Any punctuation (special) character.


Wenn in der zweiten Datei nur Teilstücke drinstehen dann musst Du jeden Schlüssel des Hashs durchsuchen. So hatte ich die Aufgabe aber nicht verstanden.

@kira: Kannst Du Deine Frage nochmal anders stellen? Ich verstehe nicht so ganz was Du willst. Am besten mit einem Beispiel!
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/
Gast Gast
 2006-07-12 12:32
#68004 #68004
Ja, echt, Entschuldigung mir bitte, die Frage ist wirklich ganz unklar. Ich versuche aber jetzt zu erklären was ich genau brauche. Also, ich habe einen Dokument wo gibt's verschiedene Sätze und Redewendungen. Es ist notwendig nur die Sätze in den anderen File rauszunehmen. Diese Sätze legen zwischen zwei "Labels"; z.b.

#String: "Dieser Satz muss raus genommen werden! Und alle Interpunktionszeichnen sollen auch im neuen File sein.- Komisch, nicht wahr?

sa023s04


So das erste "Label" ist #String: und das zweite - diese Nummer (sa023s04) die sich immer wider verändert. Aber weiß ich, dass man mit den Zeilen nicht wie mit Scalars arbeiten kann, so einfach:
Code: (dl )
1
2
3
4
5
6
$z=~/"#String:"/;
$q=~/sa[0-9]{3}s[0-9]{2}/;
if ($k>$z and $q<$k)
{
print "$k \n"
};

geht nicht.

Wie kann man das anders machen?
P.S. Entschuldigung für mein Deutsch bitte. Es ist ja sehr weit von ideal.\n\n

<!--EDIT|kira|1152693976-->
renee
 2006-07-12 12:41
#68005 #68005
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Also so etwas:

test.txt
Code: (dl )
1
2
3
4
5
6
7
8
Dies ist ein ganz normaler Text
mit Sätzen etc.

#String: "Dieser Satz muss raus genommen werden! Und alle Interpunktionszeichnen sollen auch im neuen File sein.- Komisch, nicht wahr?

sa023s04

und danach geht es weiter...


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

use strict;
use warnings;

my $file = './test.txt';
my $content;

{
local $/;
open(my $fh,'<',$file) or die $!;
$content = <$fh>;
close $fh;
}

$content =~ s/#String:.*?sa\d{3}s\d{2}\n?//sg;

print $content;
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 >| >> 18 Einträge, 2 Seiten



View all threads created 2006-07-10 14:00.