Frage

Ich habe ein Problem bei der Herstellung eines PERL-Programm für die Wörter in zwei Dokumenten übereinstimmen. Lassen Sie uns sagen, es gibt Dokumente A und B.

Also habe ich die Worte in dem Dokument A löschen möchten, die nicht im Dokument B ist.

Beispiel 1 :

A: Ich esse Pizza

B: Sie gehen auf den Markt und essen Pizza

Ergebnis: Pizza essen

Beispiel 2 : A: Pizza essen

B: Pizza essen

Ergebnis: Pizza (Das Wort ist, um relevant, so "essen" gestrichen.)

Ich benutze Perl für das System und die Sätze in jedem Dokument ist nicht in einem großen Zahlen, also denke ich, dass ich SQL nicht

verwenden

Und das Programm ist ein subproram zur automatischen Essay Bewertung für indonesische Sprache (Bahasa)

Thanx, Sorry, wenn meine Frage ist ein wenig verwirrend. Ich bin wirklich neu zu ‚dieser Welt‘:)

War es hilfreich?

Lösung

OK, ich bin ohne Zugang im Moment so ist dies nicht zu 100% garantiert oder sogar kompilieren, soll aber genügend Führung bieten:

Lösung 1 : (Wortfolge spielt keine Rolle)

#!/usr/bin/perl -w

use strict;
use File::Slurp;

my @B_lines = File::Slurp::read_file("B") || die "Error reading B: $!";
my %B_words = ();
foreach my $line (@B_lines) {
    map { $B_words{$_} = 1 } split(/\s+/, $line);
}
my @A_lines = File::Slurp::read_file("A") || die "Error reading A: $!";
my @new_lines = ();
foreach my $line (@A_lines) {
    my @B_words_only = grep { $B_words{$_} } split(/\s+/, $line);
    push @new_lines, join(" ", @B_words_only) . "\n";
}
File::Slurp::write_file("A_new", @new_lines) || die "Error writing A_new: $!";

Dies sollte eine neue Datei "A_New" erstellen, die nur A Worte enthält, die in in B sind.

Dies hat einen leichten Fehler - es ersetzt jede Mehr Leerzeichen in Datei A mit einem einzigen Raum, so

    word1        word2              word3

wird geworden

word1 word2 word3

Es kann festgelegt werden, sondern würde wirklich ärgerlich sein, dies zu tun, so dass ich nicht die Mühe, wenn Sie absolut, dass Leerzeichen 100% korrekt aufbewahrt erfordern werden

Lösung 2 : (Wortfolge Fragen, aber Sie können für die Erhaltung Leerzeichen überhaupt heraus ohne Bezug Wörter aus A drucken)

#!/usr/bin/perl -w

use strict;
use File::Slurp;

my @A_words = split(/\s+/gs, File::Slurp::read_file("A") || die "Error reading A:$!");
my @B_words = split(/\s+/gs, File::Slurp::read_file("B") || die "Error reading B:$!");
my $B_counter = 0;
for (my $A_counter = 0; $A_counter < scalar(@A_words); ++$A_counter) {
    while ($B_counter < scalar(@B_words)
        && $B_words[$B_counter] ne $A_words[$A_counter]) {++$B_counter;}
    last if $B_counter == scalar(@B_words);
    print "$A_words[$A_counter]";
}

Lösung 3 (warum brauchen wir Perl wieder? :))

Sie können dies ohne Perl in Shell triviale tun (oder über system () Anruf oder Backticks in Mutter Perl-Skript)

comm -12 A B | tr "\012" " " 

das von Perl nennen:

my $new_text = `comm -12 A B | tr "\012" " " `;

Aber siehe meinen letzten Kommentar, warum diese „schlechte Perl“ betrachtet werden kann ... zumindest wenn man dies mit sehr vielen Dateien in einer Schleife zu tun ist, um Leistung iteriert und Pflege.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top