in.txt öffnen Inhalt überprüfen und in out.txt speichern


Binio

Erfahrenes Mitglied
Ich bin ein Neuling was Perl angeht :(
Daher weiss ich noch nichtmal wie man ein Datei mit Perl öffnet :(

Aber ich weiss das Perl mächtig ist und das was ich vorhabe beweltigen kann.
Ich habe eine Datei. "in.txt" ca. 100 MB oder größer
Es sind dort ca. 2 Millionen Einträge vorhanden.
Jetzt soll Perl Zeilenweile diese Datei überprüfen.
In der Datei steht z.B.

Graf. Rudolf von Lichtenstein
ATLANTIS Management GmbH Unternehmungsberatung
Atlantis Management und Consulting GmbH
Atletic Fit Inh. Walter Schmid
ATT Bauconsulting GmbH Teutsch
Schauch Heike
Vehof Günter

ich möchte nun alle Zeilen wo GmbH, Co. KG, AG, etc vorkommt
in eine firmen.txt speichern. Alle anderen also nicht Firmen in eine out.txt.
Ist das überhaupt machbar mit PERL ?
Also so größe Dateien öffnen und bearbeiten. ?
Alle bisherigen Editoren crashen :(
Excel,gphpedit,editor,ultraedit,...

danke für jede Hilfe
 

renee

Erfahrenes Mitglied
klar geht das in Perl.

Doku zum Öffnen von Dateien: perldoc -f open bzw.. http://www.p3rl.org/open

Code (ungetestet)
Code:
#!/usr/bin/perl

# sollte in jedem Perl-Programm Standard sein, zwingt zu mehr Ordnung
# siehe auch http://wiki.perl-community.de/bin/view/Wissensbasis/UseStrict
use strict; 
use warnings;

my $infile         = '/path/to/in.txt';
my $companies = '/path/to/firmen.txt';
my $others       = '/path/to/out.txt';

# Hieran erkennt man Firmen
# qw => siehe http://www.p3rl.org/qw
my @patterns = qw(GmbH Co. KG Ltd. GbR AG);

# aus Sicherheitsgründen die 3-Arg-Form von open nehmen
# Fehlerbehandlung sollte Pflicht sein.
# öffnen aller notwendigen Dateien, '<', '>' gibt die Richtung (lesend, schreibend) an
open my $fh_in, '<', $infile or file_error( $infile );
open my $fh_comp, '>', $companies or file_error( $companies );
open my $fh_other, '>', $others or file_error( $other );

# Zeilenweises einlesen
while( my $line = <$fh_in> ){
    # überprüfen, ob Firmen-Patterns in der Zeile vorkommen
    my $is_company = 0;

    for my $pattern ( @patterns ){
        if( index( $line, $pattern ) != -1 ){
            $is_company = 1;
            last;
        }
    }


    if( $is_company ){
        # schreiben in Firmen-Datei
        print $fh_comp $line;
    }
    else {
        # in out.txt schreiben
        print $fh_other $line;
    }
}

close $fh_other;
close $fh_comp;
close $fh_in;

sub file_error {
    my ($file) = @_;

    die "Error with $file: $!";
}