perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 25
Click for quality!




11.02.2012 / 08:32

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragProbleme mit split(/\./)
Seitenanfang
Hi Leute .

Ich möchte gerne Sätze einzeln mit Nummerierung in eine Datei speichern (wird später weiterverarbeitet)

Ich habe hier mal folgenden Code versucht:

$counter=0;
for (@textdateien) #Array die alle Textdateien enthält
{ #Alle Zeilen kommen in @gesamt_txt
open(DATEI,"< $_") or die $!;
chomp($_);

@gesamt_txt=(@gesamt_txt,<DATEI>);
chomp(@gesamt_txt);

}
close (DATEI);

open (FILE,">./satz.txt") or die $!; #Schreibe eine Textdatei mit allen Zeilen
print FILE "@gesamt_txt\n";
close(FILE);

open (FILE,"<./satz.txt") or die $!; #Lese sie und erkenne Satzende am . und schneide
{
while (<FILE>)
{
chomp($_); #Sätze raus
@satz=split(/\./,$_);
$counter++;
}
close(FILE);
}

open (FILE,">./test.txt") or die $!; #Nummeriere jeden Satz und schreibe ihn in test.txt
{
print FILE "$counter;@satz\n;";
}
close (FILE);

#Leider schreibt er nur Zeile 1 bis zum Zeilenende anstatt er alle wirklichen Sätze
#(nicht nur Fragmente bis Zeilenende die mit einem Punkt enden) nummeriert ausgibt.
#Ist da ein Denkfehler?

Datum: 17.01.2007-13:51

Beitragre: Probleme mit split(/\./)
Seitenanfang
Hallo!

Warum so umständlich?
- Du liest alle Dateien ein
- Vereinigst diese und speicherst erstmal...
- und liest diese Datei nochmal ein und bearbeitest dann, um noch einmal zu speichern.
Wozu der Zwischenschritt über die Datei?

Außerdem glaube ich, das du nicht wirklich weißt, wofür 'chomp' eigentlich ist. Dieser Befehl macht nichts weiter, als den aktuellen Zeilentrenner am Ende der übergebenen Skalare zu löschen. D.h. du brauchst den Befehl nur bei den eingelesenen Zeilen anwenden, wenn du den Zeilentrenner (Standard ist \n) nicht haben willst.

So denn werden neue Zeilen mit 'push' an ein Array angehängt, nicht per Zuweisung mit '='.

Ach ja, und bei deinem Counter kommen gleich so 3-4 Denkfehler auf ein mal ;-)

Schau dir einfach mal diesen Code an, der sollte funktionieren:

use strict;

my @textdateien = @ARGV; 	# = Liste mit Dateien...
my $data; # Arbeitsvariable

for my $file (@textdateien)
{
open DAT, $file;
for my $line (<DAT>)
{
chomp $line; # Den Zeilenumbruch am Ende entfernen
$data .= $line; # und diese Zeile anhängen, wofür wir hier schon nen Skalar nehmen können
}
close DAT;
}

my @saetze = split/(?<=[\.!?])\s*/, $data;	# den Skalar mit allen Daten in Sätze aufteilen
# Getrennt wird dazu nach jedem . ? !, wobei folgende Leerzeichen gelöscht werden

open DAT, ">out.txt";	# Die Ausgabedatei
my $counter = 0; # counter initialisieren

for (@saetze)
{
print DAT $counter++, " - $_\n"; # Und der Counter muss natürlich _bei_der_Ausgabe_ hochgezählt werden.
}

close DAT;

Grüße, Skrilax

Datum: 17.01.2007-18:02

Beitragre: Probleme mit split(/\./)
Seitenanfang
Danke für deine schnelle Hilfe!

Kann ich dich mal irgendwie kontaktieren falls ich noch Fragen zu Perl habe?

Gruß
SkY

Datum: 17.01.2007-19:04

Beitragre: Probleme mit split(/\./)
Seitenanfang
Nun wollte ich noch die dazugehörigen Dateien auch mit ID speichern also habe ich ein Array @list()
genommen in den ich die Dateien eintrage.

Aber leider kommt da entweder zuviel oder zuwenig raus.
Liegt es daran , dass die Sätze konkateniert werden?

Gruß
SkY

Achja mein Codeausschnitt:

my $data; # Arbeitsvariable
my $datei;
for my $file (@textdateien)
{
open DAT, $file;
push(@liste,$file); ->SPEICHER DIE DATEIEN IN EIN ARRAY
for my $line (<DAT>)
{

chomp $line; # Den Zeilenumbruch am Ende entfernen
$data .= $line; # und diese Zeile anhängen, wofür wir hier schon nen Skalar nehmen können

push(@liste,$file);#zu viel
my @saetze = split/(?<=[\.!?])\s*/, $data;

open DATEI, ">out.txt"; # Die Ausgabedatei

$counter = 0; # counter initialisieren

for (@saetze)
{

print DATEI $counter++, "; $_ \n"; #Enthält die ID und die Sätze

}

close DATEI;

close DAT;
}

}
open DATEI ,">verweis.txt"; #Enthält die ID und die Dateinamen

foreach(@liste) #KOMMT LEIDER Mist RAUS
{
$counter2++;
print DATEI $counter2.";"."$_\n";

}
close DATEI;


Datum: 19.01.2007-15:25

-






-
-