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

Hilfe beim parsen einer Datei: entfernen von bestimmten Zeilen



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
krusty
 2006-07-05 10:59
#67837 #67837
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

habe folgendes Problem. Habe Emails von einem Postfach abgeholt. Jetzt will ich den ganzen Headerbereich löschen und nur die Nachricht ansich speichern.

Getrennt wir der Header von dem Text durch eine Leerzeile. Will mit dem Perlscript alles was vor der Leerzeile ist und die Leerzeile löschen und nur den Text in einer neuen Datei speichern.

Wie kann man das mit einem Perlscript realiesieren? Kann mir jemand helfen?

Gruß
Krusty\n\n

<!--EDIT|krusty|1152082893-->
Thorium
 2006-07-05 11:08
#67838 #67838
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my @mail = mail_lesen();
my @nachricht; # nachricht ohne Header

my $im_header = 1;
while (defined(my $zeile = shift(@mail))) {
    if ($im_header) {
        if ($zeile eq '') {
            $im_header = 0;
        }
        next;
    }

    push @nachricht, $zeile;
}


Bei $zeile eq '' musst du evt. auf ein newline testen, oder das newline zuvor mit chomp entfernen - je nachdem wie du die Nachricht einliest
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
krusty
 2006-07-05 11:23
#67839 #67839
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
[quote=Thorium,05.07.2006, 09:08][/quote]
Hallo Thorium,

vielen Dank für die schnelle Hilfe. Habe leider noch ein kleines Problem bei deinem Code. Bei der Vergleich if ($zeile eq '') findet das Script nicht. Kann man noch irgendwie anders nach einer Leerzeile suchen?
renee
 2006-07-05 11:37
#67840 #67840
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde es so machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $nachricht = '';
{
local $/ = "\n\n";
open(my $fh,"<",$mail) or die $!;
while(my $part = <$fh>){
$nachricht .= $part unless($. == 1);
}
close $fh;
}

print $nachricht;
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/
krusty
 2006-07-05 11:51
#67841 #67841
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Habe den Fehler gefunden. Musste zurvor noch alle Returns abschneiden, dann funktioniert es. Danke an alle.

Gruß Krusty
renee
 2006-07-05 12:07
#67842 #67842
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=krusty,05.07.2006, 09:23]Kann man noch irgendwie anders nach einer Leerzeile suchen?[/quote]
Normalerweise prüft man auf Leerzeile mit
Code: (dl )
1
2
3
if($line =~ /^$/){
print "Leerzeile\n";
}
\n\n

<!--EDIT|renee|1152087004-->
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/
Crian
 2006-07-05 13:22
#67843 #67843
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
doch wohl eher mit

Code: (dl )
if (length $zeile == 0) {...}


oder

Code: (dl )
if ($zeile eq '') {...}
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2006-07-05 13:54
#67844 #67844
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Crian,05.07.2006, 11:22]doch wohl eher mit

Code: (dl )
if (length $zeile == 0) {...}


oder

Code: (dl )
if ($zeile eq '') {...}
[/quote]
nö, \n hat immer noch die Länge 1

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use warnings;

while(my $line = <DATA>){
print $.,":", length($line),"\n";
}

__DATA__
Diest ist


Ausgabe:
Code: (dl )
1
2
3
C:\>mail.pl
1:10
2:1


und \n ne ''

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;

#local $/ = "\n\n";
while(my $line = <DATA>){
print $.,":", length($line),"\n" unless($line eq '');
}

__DATA__
Diest ist


Ausgabe:
Code: (dl )
1
2
3
C:\>mail2.pl
1:10
2:1
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/
renee
 2006-07-05 13:57
#67845 #67845
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Aber für meine erstgenannte Lösung ist das sowieso unerheblich...
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/
Crian
 2006-07-05 14:08
#67846 #67846
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Ich chompe Zeilen immer bei der Verarbeitung.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-07-05 10:59.