Schrift
[thread]8347[/thread]

split geht nicht: steh mal wieder im wald



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
sabrina
 2006-09-20 13:39
#70076 #70076
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
hi, hab ne neue datei die gesplittet werden soll, so wie die alte, zwischen jedem neuem wort soll ein ";" stehen
code lautet[quote]:
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
#!/usr/bin/perl
use strict;
use warnings;
my $file = 'KNAPP_2005.txt';
my $files = 'knappziel_1_3.txt';
my @data;
my @lines;
open(my $fh,'<';$file) or die $!;
while(my $line = <$fh>{
#chomp $line;
my @line = (split(/[\t\s\:\\]/,$line));
foreach (@line){
s/^\s+/;/g;
s/\s+$/;/g;
}
if ($line =~/\bfast\b/){
push(@lines,$line);
}
}
close $fh or die "kann nicht schliessen$!"
print $_ for (@lines);
open(my $w_fh,'>',$files) or die $!;
print $w_fh $_ for (@lines);
close $w_fh or die "kann nicht schliessen $w_$!";

die verarbeiteten daten sehen nach der bearbeitung meines codes so aus:
Code: (dl )
1
2
     groesse    treffer     benutzer
     783652.76 63574       fast: G:\FILES\geh8

die ueberschrift groesse usw hab ich schon geloescht den  die brauch ich nicht.
es soll nach jedem \t\s\:\\ gespalten werden und egal wieviele leerstellen es sind, es darf nur ein ";" zwischen den woertern stehen.
chomp ist mit einem # versehen, weil sonst die daten alle in einer Reihe stehen, denk da fehlt wohl irgendwo "\n" aber wo?und warum splittet es nicht, es ist doch fast das gleiche splitt wie im anderen CODE. Waere lieb von euch wenn mir jemand helfen koennte
ps.
das hex zeichen entferne ich spaeter wenn die ";" drinn sind.
lg sabrina\n\n

<!--EDIT|sabrina|1158745262-->
pq
 2006-09-20 14:19
#70077 #70077
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=sabrina,20.09.2006, 11:39]chomp ist mit einem # versehen, weil sonst die daten alle in einer Reihe stehen, denk da fehlt wohl irgendwo "\n" aber wo?[/quote]
in der regel kommt der zeilenumbruch am ende einer zeile. eine zeile
steht bei dir in $line.
jetzt klar?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Relais
 2006-09-20 14:25
#70078 #70078
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=sabrina,20.09.2006, 11:39]es soll nach jedem \t\s\:\\ gespalten werden und egal wieviele leerstellen es sind,[/quote]
Damit beschreibst Du jetzt die Ausgabe?

Quote
es darf nur ein ";" zwischen den woertern stehen.

Damit beschreibst Du die Eingabeverarbeitung. Anmerkung: \t ist schon in \s enthalten.

Übrigens wirfst Du die Änderungen an @line derzeit weg.

Wenn das so ist, dann kannst Du zum einen darauf verzichten jedes einzelne "Splitzeichen" zu verarbeiten, zum anderen kannst Du Dir überlegen, auf Split vielleicht auch ganz zu verzichten.

Aber ohne soweit gehen zu wollen, probier
Code: (dl )
[\s:\\]+
so daß Du die Info darüber, wie viele nicht-Wort-Zeichen zwischen den Wörtern stehen ingnorierst. Später willst Du sie na nur durch ";" getrennt ausgeben.

Quote
print $_ for (@lines);


wird zu print join( ";", @lines );

Dann bist Du schon fast am Ziel.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
sabrina
 2006-09-20 14:29
#70079 #70079
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
@pq
wenn ich dich richtig verstanden habe, dann brauch ich bei diesem code, keine chomp?
danke hoffe ich hab es richtig interpretiert.
und warum splittet es nicht, der code muesste doch stimmen oder nicht?
lg sabrina
sabrina
 2006-09-20 14:40
#70080 #70080
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
@Relais
Code: (dl )
1
2
3
4
Zitat (sabrina @ 20.09.2006, 11:39) 
es soll nach jedem \t\s\:\\ gespalten werden und egal wieviele leerstellen es sind,

Damit beschreibst Du jetzt die Ausgarbe?
ja die ausgabe soll nach diesen kriterien gesplittet werden.
die durch ";" getrennten woerter sollen in der ausgabe stehen so das so was mal da steht.
Code: (dl )
783652.76;63574;fast;:;G;:;\;FILES;\;geh8

wenn das da steht, kann ich "fast" aus dem string entfernen.
ich wollte die aenderungen nicht wegschmeissen, schau grad noch mal drueber, danke fuer den hinweis:
kann ich das verhindern wenn ich das so aender?:
Code: (dl )
1
2
my @array = (split(/[\s\:\\]/,$line));
foreach (@array) {

lg sabrina\n\n

<!--EDIT|sabrina|1158749183-->
renee
 2006-09-20 14:53
#70081 #70081
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
#!/usr/bin/perl

use strict;
use warnings;

my $file = 'KNAPP_2005.txt';
my $files = 'knappziel_1_3.txt';
my @lines;

open(my $fh,'<',$file) or die $!;
while(my $line = <$fh>){
chomp $line;
my @line = (split(/[\s\:\\]+/,$line));
if ($line =~/\bfast\b/){
push(@lines,\@line);
}
}
close $fh or die "kann nicht schliessen$!"

print $_ for (@lines);

open(my $w_fh,'>',$files) or die $!;
print $w_fh join(";",@$_),"\n" for (@lines);
close $w_fh or die "kann nicht schliessen $w_$!";
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/
sabrina
 2006-09-20 15:11
#70082 #70082
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
@renee
danke schoen!
unglaublich mit einem blick, ich such den fehler mal wieder ewig.
hab das erste print weggelassen gibt was anderes als das print das in eine neue datei uebergeben wird.
danke fuer die schnelle hilfe bis bald, werd noch ein paar sachen einbauen.
lg sabrina
sabrina
 2006-09-20 15:37
#70083 #70083
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
supi ohne nachfragen zu muessen hab ich mit splice was entfernt und es geht!
:laugh: :cool: ich weis es ist nicht wirklich schwere
Code: (dl )
1
2
3
if ($line =~/\bfast\b/){
splice @line,3,1;
push(@lines,\@line);
hab aber doch noch ne dumme frage und zwar steht in der ersten spalte ein ";" und das sollte ich doch durch  
Code: (dl )
1
2
3
foreach (@line){
tr/^\;+/g;
}
wegbekommen oder so aehnlich. tr steht doch fuer einzelnes zeichen oder?
lg sabrina\n\n

<!--EDIT|sabrina|1158753213-->
renee
 2006-09-20 15:57
#70084 #70084
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
while(my $line = <$fh>){
chomp $line;

if ($line =~/\bfast\b/){
$line =~ s/^[\s\:\\]+//;
my @line = (split(/[\s\:\\]+/,$line));
splice @line,3,1;
push(@lines,\@line);
}
}
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/
sabrina
 2006-09-20 16:00
#70085 #70085
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
am besten ich lass den code so wie er ist und schreib das mit foreach in den code in dem beide dateien zu einer werden.
mal schauen wie ich das mache.
lg sabrina



edit hab dein post zu spaet gelesen probier es mal auf deine art!
danke fuer den post\n\n

<!--EDIT|sabrina|1158753688-->
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-09-20 13:39.