perl :: Knobelaufgabe


exitboy

Erfahrenes Mitglied
Mir liegt ein Datenbankextrakt vor. Dieser sieht wie folgt aus:

Vorname;Nachname;Strasse ... drunter finden sich immer die Namen + Strassen (wie es eine gefuellte Tabelle so an sich hat)

Mit folgendem Perlscript, wollte ich nun die zuletzt eingelesene Spalte in einzelne Variablen aufspalten, sodass ich zum einen die ; als Trennzeichen nutze und den davor stehenden Inhalt einer Variable zuordne.

Da meine txt Datei mehrere Millionen Kundendatensaetze hat, dacht ich ich koennte ein Array nutzen:

Code:
sub filterline{
  @do_filter_on = $_[0];
  @do_filter_on =~ s/([;])/\n/g;
  
  foreach(@do_filter_on){
    print "$&";
  }
}
Natuerlich kann das auf die Art wie ich es gemacht haben nicht funktionieren.
Die Datensaetze trennen kann ich optisch per \n (siehe RegEx.).

Was ich jedoch noch nicht geschafft habe ist, diese Trennung in Variablen zu speichern. Hat da jemand eine Idee fuer mich? Vielen Dank.
 

renee

Erfahrenes Mitglied
Ich verstehe nicht so ganz was Du willst. Kannst Du bitte an Hand von einem Beispiel erklären was Du hast und was am Ende rauskommen soll?
 

exitboy

Erfahrenes Mitglied
Ich poste mal einfach meinen gesamten Script, dann wird es vielleicht einfacher das Problem zu verstehen. Muss dazu sagen bin noch relativ neu in Perl und wirklich noch in der Lernphase.

Denke das Problem ist recht einfach mit der Variable $(+ irgendetwas) zu loesen:

Ich moechte einfach die Stringinhalte die hier in meinem Script als Gesamtzeile ausgelesen werden in einzelne Variablen erhalten, sodass ich damit weiterarbeiten kann. Dachte da an die Moeglichkeit immer den Wert vor einem ; in eine Variable zu packen um dann das Array zu beladen (oder auch direkt).

Z.b. soll ein Array Vornamen[], Nachnamen[], Strasse []... erstellt werden. So wie ich diese momentan auslese erhalte ich jedoch nur die Ausgaben:
Code:
Tom;Mueller;Bahnhofsstr. 13;49383;Duisburg;
Philip;Schuster;Dorfstr.2b;39323; Musterhausen;
Und genau hier benoetige ich Eure Hilfe.

hier ist mein Code:

Code:
#!/usr/bin/perl
system "clear";
print "=== Clear Customer DB V0.1 ===================\n\n";

# cmd routine
if (!@ARGV[0] or !@ARGV[0] eq 0){
  print "please use like this:\nperl cleardb.pl [startline checklines]\n\n";
  exit;
}

#Filehandles
open (IN,"kunden.txt");
open (OUT,">kunden_backup.txt");

$line = 0;
while (<IN>){
  $line = $_;
  #$line =~ s/([\/a])//g;              spaetere Ersetzung
  #print "$line\n";

  #counter fuer zeilen
  $x++;

  #Show Arguments
  if ($x eq @ARGV[0] or $x eq @ARGV[1]){
    &filterline($line,$x);
  }

  chomp $line;
#  print OUT $line."\n";
}


#finished
print "\ndone\n\n";

close IN;
close OUT;




sub filterline{
  $do_filter_on = $_[0];


  $do_filter_on =~ s/([;])/\n/g;
  print "$line";


 # foreach($do_filter_on){
 #
 #   print "$&";
 # }
}
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
Hi.

Wie wär's denn hiermit:
Perl:
use strict;

sub transpose {
  map {
    my $j = $_;
    [ map $_[$_][$j], 0..$#_ ]
  } 0..$#{$_[0]};
}

my @records;

while (<>) {
	chomp();
	my @a = split(/;/, $_);
	push(@records, \@a);
}

my ($vorname, $name, $strasse, $plz, $ort) = transpose(@records);

print "Vornamen: \n\n" . join("\n", @$vorname) . "\n\n------------\n";

print "Namen: \n\n" . join("\n", @$name) . "\n\n------------\n";

print "Orte: \n\n" . join("\n", @$ort) . "\n\n------------\n";
Gruß