Thread xlxs oder csv Datei einlesen und ausgeben (7 answers)
Opened by Peven at 2017-03-07 16:02

hlubenow
 2017-03-07 23:08
#186226 #186226
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Ich hab' sowas mal geschrieben. Ist relativ komplex geworden, machte am Ende aber genau das, was ich wollte (was fertige Datenbankprogramme, abgesehen von teuren Speziallösungen, womöglich nicht gekonnt hätten).
Bewährt hatte sich damals, die Datenzeilen zu trennen und getrennt nach Feldern jeweils in einen Hash zu schreiben. Dann kann man über die Feldnamen auf die Daten in dem Hash zugreifen:

Wichtig war weiterhin, die Daten, wann immer möglich auf Fehler zu prüfen, also ein größeres Fehlermanagement aufzubauen. Wenn ein Datenfehler auftrat, sollte das Skript nach Möglichkeit ausgeben, in welchem Datensatz sich der Fehler befand und worin der Fehler bestand.

Beachte, daß man unbedingt einen eindeutigen Feldtrenner braucht, der nicht in den Daten selbst vorkommen darf. Ich habe hier das Semikolon verwendet.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl

use warnings;
use strict;

my @fields = qw(Nachname Vorname Alter Hobbies);

my $data = <<'END_HERE_1';
Müller;Jens;42;Fußball, Tennis, Vögel beobachten
Knusper;Ronny;34;lesen, schlafen, langweilen
END_HERE_1

my @data = split(/\n/, $data);

sub getHashFromRecord {
    my $record = shift;
    my %h;
    my $i;
    my @s = split(/;/, $record);
    if ($#s != $#fields) {
         die "Wrong number of fields in record $record.\n";
    }
    foreach $i (0 .. $#fields) {
        $h{$fields[$i]} = $s[$i];
    }
    return %h;
}

my %h;
my $i;
my $record;
print "Suchanfrage: ";
my $q = <STDIN>;
chomp($q);
foreach $record (@data) {
    %h = getHashFromRecord($record);
    if ($h{Nachname} eq $q) {
        print "\n";
        foreach $i (@fields) {
            print "$i:\t$h{$i}\n";
        }
        print "\n";
    }
}

View full thread xlxs oder csv Datei einlesen und ausgeben