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

Newbie - Einlesen von Text in arrays (Seite 2)



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
renee
 2004-12-28 12:24
#50372 #50372
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
das & gehört nicht zu \w

Ändere mal /VOL=(\w*)/, ind /VOL=([\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/
PatrickS
 2004-12-28 15:39
#50373 #50373
User since
2004-12-27
7 Artikel
BenutzerIn
[default_avatar]
Hallo Renee,

ich hab nun folgendes gemacht, damit bekomm ich schonmal alle VOL Werte:
Code: (dl )
print DATAOUT join "", /URSPRUNG=(\d*)/, /CODE=(\d*)/, "VOL", /VOL=(\d*)/, /&(\d*)/g, "\n" while <DATAIN>;

Aber mit dem kopieren und ersetzen der kopierten Zelle komm ich nicht weiter - ich such schon zwei Stunden nach etwas ähnlichem, mittlerweile sehe ich keine Bäume mehr und einfachste Dinge bekomm ich nicht mehr eingelesen.

Quote:
Das & beschreibt ein Volumen dh. aus 1233202188333&4&5 sollen später drei Zeilen generiert werden:
123320218833
123320218834
123320218835

Gruß
Patrick
PatrickS
 2004-12-28 17:47
#50374 #50374
User since
2004-12-27
7 Artikel
BenutzerIn
[default_avatar]
Hallo,

kann mir jemand diese Zeilen kommentieren?
Ich versuch mit folgendem Code die Zeilen zu kopieren und teilweise zu ersetzen wie in meinem letzten Beitag angefragt - ich komm nicht weiter...

open(DATA,"file01.txt");
@satz = <DATA>;
close(DATA);

foreach (@satz)
{
$t= split(/ /,$_);
print "$t\n";
$t =~ s/&/TOLL/;
print "$t\n";
}
Taulmarill
 2004-12-29 00:11
#50375 #50375
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich glaube nicht, dass der code tut was du willst, aber egal...
Code: (dl )
1
2
3
open(DATA,"file01.txt");
@satz = <DATA>;
close(DATA);

öffnet die datei file01.txt und liesst allen inhalt der datei in das array @satz. danach wird die datei wieder geschlossen.
Code: (dl )
1
2
3
4
5
6
7
foreach (@satz)
{
$t= split(/ /,$_);
print "$t\n";
$t =~ s/&/TOLL/;
print "$t\n";
}

hier wird in einer foreach schleife jedes element des arrays @satz durchgegangen (da keine variable angegeben ist, wird das element jeweils in $_ gespeichert).
das split gibt, da es im scalaren kontext steht, nich das erste element sondern die anzahl der nach leerzeichen getrenten elemente in $_ zurück.
$t =~ s/&/TOLL/; ersetzt alle & Zeichen mit 'TOLL'.
die print funktionen solltest du aber versetehen, oder?

mal ganz ehrlich, wo hast du das her? soll das so eine art musterlösung sein?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Strat
 2004-12-29 00:57
#50376 #50376
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn die datei editiert werden soll, koennte dafuer das Modul Tie::File hilfreich sein, z.B.
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
use Tie::File;
my @file;
tie @file, 'Tie::File', $filename or die "Error: couldn't tie $filename to array: $!\n";
# jedes element von @array entspricht jetzt einer zeile
foreach my $line (@file) {
my %data = &ParseLine($line);
# mach was mit %data; zum aendern einer Zeile einfach $line neu bilden

} # foreach
untie(@array);
# -----------------------------------------------------
sub ParseLine {
my ($line) = @_;

my %data = ();
foreach my $item (split(/,/, $line)) { # item ist z.B. "Ursrpung=001"

# $key ist z.B. "Ursprung", $value z.B. "001"
my ($key, $value) = split(/=/, $item, 2);

# in hash speichern; achtung, falls ein key mehrere werte hat, bleibt nur
# der letzte
$data{$key} = $value;
} # foreach

return %data;
} # ParseLine


[/code]
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
PatrickS
 2004-12-29 09:39
#50377 #50377
User since
2004-12-27
7 Artikel
BenutzerIn
[default_avatar]
Hallo,

wo ich den Code herhab, den hab ich mir zusammengesucht - mein Problem gestern war, dass ich zuviel machte und später weder etwas funktionierte noch ich verstand, was ich tat. Da mich das ganze sehr beschäftigt, sind mir gestern abend und die Nacht ein paar Sachen eingefallen, ich versuch jetzt die Zeilen in Arrays einzulesen und mithilfe der & zu splitten.
Ich meld mich später nochmal.

Gruß
Patrick
Crian
 2005-01-03 17:22
#50378 #50378
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=PatrickS,28.12.2004, 14:39]
Code: (dl )
print DATAOUT join "", /URSPRUNG=(\d*)/, /CODE=(\d*)/, "VOL", /VOL=(\d*)/, /&(\d*)/g, "\n" while <DATAIN>;
[/quote]

Du hast die Zeile ja auch nicht wie vorgeschlagen geändert. Gehts so?

Code: (dl )
1
2
3
4
5
open DATAIN, 'file.txt' or die $!;
open DATAOUT, '>outputfile.txt' or die $!;
print DATAOUT join "", /URSPRUNG=(\d*)/, /CODE=(\d*)/,  /VOL=([\w\&]*)/, "\n" while <DATAIN>;
close DATAIN;
close DATAOUT;
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
Strat
 2005-01-04 01:08
#50379 #50379
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=PatrickS,29.12.2004, 08:39]ich versuch jetzt die Zeilen in Arrays einzulesen und mithilfe der & zu splitten.[/quote]
dafuer kannst du die Funktion ParseLine verwenden, die ich oben angegeben habe. Da bekommst du einen Hash zurueck, z.B.
Code (perl): (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
unless (open (FH, $filename)) {
  die "Error: couldn't read '$filename': $!";
}
while (<FH>) {
  chomp($_); # zeilenumbruch am ende killen
  my %items = &ParseLine($_);

  # mach was mit %items
} # while
close (FH);
# -----------------------------------------------------
sub ParseLine {
  my ($line) = @_;

  my %data = ();
  foreach my $item (split(/,/, $line)) { # item ist z.B. "Ursrpung=001"

    # $key ist z.B. "Ursprung", $value z.B. "001"
    my ($key, $value) = split(/=/, $item, 2);

    # in hash speichern; achtung, falls ein key mehrere werte hat, bleibt nur
    # der letzte
    $data{$key} = $value;
  } # foreach

  return %data;
} # ParseLine


So Sachen parse ich nur ungern mit regulaeren Ausdruecken, denn wenn sich die Reihenfolge der Felder aendert oder neue Felder hinzukommen, fliegt einem der regulaere Ausdruck um die Ohren, und man bekommt gar nichts mehr (ok, sowas kann ja gewuenscht sein). Mit split nach hash bekommt man da die neuen felder auch gleich automatisch\n\n

<!--EDIT|Strat|1104793759-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2005-01-04 08:19
#50380 #50380
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann würde ich eher einen Hash of Hashes machen, und den Ursprung als Schlüssel...
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
32
33
34
35
36
37
38
#! /usr/bin/perl

use strict;
use warnings;

my %hash;
while(my $line = <DATA>){
 my %inner_hash;
 foreach my $item(split(/,/,$line)){
   my ($key,$val) = split(/=/,$item);
   $key =~ s/[^\w]//g;
   $val =~ s/[^\w&]//g;
   $inner_hash{$key} = $val;
 }
 push(@{$hash{$inner_hash{URSPRUNG}}},\%inner_hash);
}

foreach my $key(keys(%hash)){
 foreach my $elem(@{$hash{$key}}){
   my ($base,@vols) = split(/&/,$elem->{VOL});
   foreach(@vols){
     print $key," ",$elem->{CODE}," ",$base.$_,"\n";
   }
print $key," ",$elem->{CODE}," ",$base,"\n" unless(@vols);
 }
}
# _ _DATA_ _ ohne Leerzeichen!!
_ _DATA_ _
:URSPRUNG=123,CODE=320317440,VOL=0&1&2&3&4&5&6&7&8&9!
:URSPRUNG=123,CODE=3203177290,VOL=0&1&2&3&4&5&6&7&8&9!
:URSPRUNG=123,CODE=320317770,VOL=0&1&2&3&4&5&6&7&8&9!
:URSPRUNG=123,CODE=32021883,VOL=3&4&5!
:URSPRUNG=123,CODE=4203204,VOL=4&5&6&7!
:URSPRUNG=125,CODE=32021883,VOL=3&4&5!
:URSPRUNG=125,CODE=4203204,VOL=4&5&6&7!
:URSPRUNG=124,CODE=32021883,VOL=3&4&5!
:URSPRUNG=124,CODE=4203204,VOL=164564&5&6&7!
:URSPRUNG=124,CODE=4203206,VOL=124&5&6!


Ausgabe:
Quote
125 32021883 34
125 32021883 35
125 4203204 45
125 4203204 46
125 4203204 47
123 320317440 01
123 320317440 02
123 320317440 03
123 320317440 04
123 320317440 05
123 320317440 06
123 320317440 07
123 320317440 08
123 320317440 09
123 3203177290 01
123 3203177290 02
123 3203177290 03
123 3203177290 04
123 3203177290 05
123 3203177290 06
123 3203177290 07
123 3203177290 08
123 3203177290 09
123 320317770 01
123 320317770 02
123 320317770 03
123 320317770 04
123 320317770 05
123 320317770 06
123 320317770 07
123 320317770 08
123 320317770 09
123 32021883 34
123 32021883 35
123 4203204 45
123 4203204 46
123 4203204 47
124 32021883 34
124 32021883 35
124 4203204 1645645
124 4203204 1645646
124 4203204 1645647
124 4203206 1245
124 4203206 1246
\n\n

<!--EDIT|renee|1104819662-->
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/
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2004-12-27 15:24.