Schrift
[thread]6315[/thread]

Suche immer noch Regulären Ausdruck



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Mia
 2004-06-07 10:43
#83084 #83084
User since
2004-06-01
12 Artikel
BenutzerIn
[default_avatar]
Hallo ihr,

ich habe die letzten Tage immer noch ein meinem Problem gesessen und habe immer noch keine Lösung. Ich hoffe, ihr könnt mir auch dieses Mal helfen, es ist das gleiche Problem wie mein letztes Posting. Mit dem Code von foobar habe ich es leider nicht hinbekommen.
Also, ich habe eine text.txt Datei, die ich einlesen möchte und in eine aufgaben.txt schreiben möchte.
Diese Datei hat folgende Form:

Bla bla,
bla bla bla - bla bla. Bla bla, bla bla bla. usw.
Bla bla bla.

Aufgabe 1
Text Text Text
Seite 1-2

Aufgabe 2
Text Text Text
Seite 7

Bla bla bla,
Bla bla bla.

Wie schon gehabt, möchte ich die fettgedruckten Textpassagen in die aufgabe.txt Datei schreiben, alles nicht-fettgedruckte soll gelöscht werden. So, das mit den Seiten habe ich dank renees Hilfe schon hinbekommen, aber
ich bekomme das einfach nicht hin. Das Öffnen und Schreiben klappt. Aber vielleicht stimmt an meine Konzept was nicht ????


Code: (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 -w

use strict;

open (MAIL, "text.txt")
     or die "Die Datei kann nicht geoeffnet werden: $!";

open (FILE, "aufgabe.txt")
     or die "Die Datei kann nicht geoeffnet werden: $!";

my $line1 = <MAIL>;

while (defined($line1)) {
 $_ = $line1;

 s/[\w]*\n Aufgabe /Aufgbe/g;

 print FILE $_;
 $line1 = <MAIL>;

}


Ratlos und verzweifelt,
Mia

edit renee: schließenden [code]-tag eingefügt...\n\n

<!--EDIT|renee|1086592842-->
renee
 2004-06-07 11:19
#83085 #83085
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
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 warnings;
use diagnostics;

my $infile = 'text.txt';
my $outfile = 'aufgaben.txt';
my $b_aufgabe = 0;
my $i = 0;
my @aufgaben = ();

open(R_FILE,"<$infile") or die $!;
my @lines = <R_FILE>;
close R_FILE;

foreach my $line(@lines){
$b_aufgabe = 1 if($line =~ /^Aufgabe/);
next unless($b_aufgabe);
$aufgaben[$i] .= $line;
if($line =~ /^Seite/){
$b_aufgabe = 0;
$i++;
}
}

open(W_AUFGABE,">$outfile") or die $!;
print W_AUFGABE $_,"\n" for(@aufgaben);
close W_AUFGABE;
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/
Taulmarill
 2004-06-07 11:21
#83086 #83086
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
also, wenn ich das richtig verstanden habe ist eine zeile mit "Aufgabe" am anfang der begin und eine zeile mit "Seite" am anfang das ende des von dir gewünschten blocks.
folgendes sollte dann funtionieren, die regexe be bedarf verfeinern.
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
#! /usr/bin/perl -w

use strict;

open (MAIL, "<text.txt")
or die "Die Datei kann nicht geoeffnet werden: $!";

open (FILE, ">aufgabe.txt")
or die "Die Datei kann nicht geoeffnet werden: $!";

my $bold = 0;
while (my $line = <MAIL>) {
if ( $line =~ /^Aufgabe/ ) {
$bold = 1;
}

print FILE $line if $bold;

if ( $line =~ /^Seite/ ) {
$bold = 0;
print "\n";
}
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Mia
 2004-06-07 12:29
#83087 #83087
User since
2004-06-01
12 Artikel
BenutzerIn
[default_avatar]
Hi Taumarill,

danke für die schnelle Hilfe. Es klappt!! Leider steht die Seitenangabe nicht immer am Anfang einer Zeile. Ich weiss nur, dass sie immer als letztes eines solchen Aufgaben-Abschnittes steht (mein Fehler vorhin).
Also der Form

Aufgabe 1 von 2

Bewertung: 3 Punkte #optional

Thema: Text Text Text, Text Text

Beschreibung: blablabla
blabla bla.
blabla Buch: Blabla, Seite 3-4

------

Aufgabe 2 von 2

Thema: Text Text Text, Text Text

Beschreibung: blablabla
blabla bla.
blabla Buch: Blabla, Seite 3-4


Diese Abschnitte konnte ich mit deinem Code in die Extra-Datei schreiben.

Nur: wie kann ich diese Strings bearbeiten? Ich hätte also gerne in der aufgabe.txt:


<Aufgabe> 1 von 10 </Aufgabe>
<Bewertung> 3 Punkte </Bewertung>
<Thema> Text Text Text </Thema>
<Beschreibung>  blabla </Beschreibung>
<Buch> blabla </Buch>
<Seite> 3 - 4 </Seite>

usw...


Und was mach ich denn mit Teil-Abschnitten, die keine Bewertung haben wie in Aufgabe 2? Da möchte ich gerne einfügen:
<Bewertung> keine </Bewertung>

Könnt ihr mir (Neuling) da helfen?


Vielen lieben Dank!!
Mia
Taulmarill
 2004-06-07 12:38
#83088 #83088
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hm, im prinzip is das meiner auffassung nach arbeit für regex. du solltest dir mal die tutorials dazu anschauen. ich verlinke hier mal auf die seite perldoc.com. aber du kannst auch mit dem shellkomando perldoc die gesamte doku aufrufen, falls dir das lieber ist.

perlrequick Perl regular expressions quick start
=> http://www.perldoc.com/perl5.8.4/pod/perlrequick.html
perlretut Perl regular expressions tutorial
=> http://www.perldoc.com/perl5.8.4/pod/perlretut.html
perlre Perl regular expressions, the rest of the story
=> http://www.perldoc.com/perl5.8.4/pod/perlre.html

ein guter regex für die Seite währe evtl. /Seite \d/ (untested).
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Mia
 2004-06-07 13:12
#83089 #83089
User since
2004-06-01
12 Artikel
BenutzerIn
[default_avatar]
Hi,
ich konnte mit renees Code die Seiten schon finden:

Code: (dl )
s/(S\.\s\d+(\s\-\d+)?)/<Seite>$1<\/Seite>/g;


Das Problem was ich habe: ich kann die Strings nicht mehr bearbeiten. Wie schaffe ich es also innerhalb der Schleife die Strings zu suchen und zu ersetzen?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my $bold = 0;
while (my $line = <MAIL>) {
if ( $line =~ /^Aufgabe/ ) {
  $bold = 1;
}

print FILE $line if $bold;

if ( $line =~ /^Seite/ ) {
  $bold = 0;
  print "\n";
}
}


???
Mia
 2004-06-07 13:23
#83090 #83090
User since
2004-06-01
12 Artikel
BenutzerIn
[default_avatar]
Ohhh, oben geschriebenes Problem habe ich gelöst. War ein Tippfehler.

Dennoch habe ich das Problem mit der optionalen Bewertung. Gibt es dafür eine Lösung? Wie gesagt, ich sitze da schon ein paar Tage dran und bin immer noch ratlos.

Mia,
die ganz doll um Hilfe bittet!
Taulmarill
 2004-06-07 13:24
#83091 #83091
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
nun, jede zeile wird in der variable $line gespeichert. wenn du die zeile bearbeiten willst, kannst du einfach den inhalt der variable bearbeiten, solange diese noch nicht in die datei geschrieben wurde.
man könnte die zeile print FILE $line if $bold; durch so etwas ersetzen.
Code: (dl )
1
2
3
4
5
if ( $bold ) {
$line =~ s/(S\.\s\d+(\s\-\d+)?)/<Seite>$1<\/Seite>/g;
#noch ein paar sachen mehr
print FILE $line;
}
\n\n

<!--EDIT|Taulmarill|1086600292-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
coax
 2004-06-07 17:40
#83092 #83092
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Mia,
Ich hab das mal alles mit einen RegExp geloest:
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
# komplette Datei in $data einlesen
my($data);
open(MAIL, '<', 'text.txt') or die $!;
{
undef($/);
$data = <MAIL>
}
close(MAIL);

open(FILE, '>', 'aufgabe.txt') or die $!;

while($data =~ m {
                 .*?   Aufgabe  \s+ (\d+) \s+  von  \s+ (\d+)   .*? \n+
                       (?: Bewertung: \s+ (\d) \s+ Punkte)?     .*? \n+
                 .*?   Thema: (.+?)                                 \n+
                 .*?   Beschreibung: ((?:.|\n)+?)
                       Buch: \s+ (.+?), \s+ Seite \s+ (\d+) - (\d+)
                }gxs){


    printf(FILE<<"END", $1, $2, $3, $4, $5, $6, $7, $8);
<Aufgabe> %d von %d </Aufgabe>
<Bewertung> %s Punkte </Bewertung>
<Thema> %s </Thema>
<Beschreibung> %s </Beschreibung>
<Buch> %s </Buch>
<Seite> %d-%d </Seite>

END
}
close(FILE);

mit meiner Testdatei (gefuellt mit den Testdaten von dir) funktioniert es bestens.
Sollte es bei dir nicht funktionieren waeren "echte" Testdaten besser um den RexExp entsprechend anzupassen.\n\n

<!--EDIT|coax|1086615686-->
,,Das perlt aber heute wieder...'' -- Dittsche
Taulmarill
 2004-06-07 17:51
#83093 #83093
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
sieht nicht schlecht aus, mann sollte aber genau so wie bei renees lösung darauf achten, dass die datei locker in den ram passt, da sie komplett und nicht zeilen oder Blockweise ausgelesen wird.
fals die dateigrösse keine problem ist, gefällt mir die lösung von coax sehr gut :)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-06-07 10:43.