Thread CSV-Datei ohne Modul schreiben (15 answers)
Opened by Stuermchen at 2011-07-12 09:07

rosti
 2011-07-12 13:03
#150318 #150318
User since
2011-03-19
3492 Artikel
BenutzerIn
[Homepage]
user image
Probiers den Code einfach mal aus. Sofern Dir die Datenstruktur genügt.

Bissl mehr nun:
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
use strict;
use warnings;


package Names;

###########################################################################
# Rolf Rost, 14.2.2011
# Anonyme Array-Elemente bekommen Namen
###########################################################################
use strict;

# Setzt ein Array in ein Objekt um
sub new{
        my $class = shift;
        my $maps  = shift; # {3 => 'Day', 4 => 'Month', 5 => 'Year'}
        my $aref  = shift; # p.e. from localtime, stat, etc.
        return if ref $maps ne 'HASH';
        return if ref $aref ne 'ARRAY';
        my $self  = {};
    for(my $i = 0; $i < scalar(@$aref); $i++){
       $self->{$maps->{$i}} = $aref->[$i] if exists $maps->{$i};
    }
    
    return bless $self, $class;
}
1; ########################################################################

package CSV;

use IO::File;
use Carp;

sub new{
        my $class = shift;
        my $file = shift or croak "No File";

        my $handle = _handle($file) or croak "$!";

        # die Spalten-Namen ergeben sich aus der ersten Zeile
        my $self = bless{
                FH => $handle,
                COLS => {},
                DATA => {},
                FIRSTLINE => undef,
                FIRSTKEY => '',
        }, $class;
        $self->_deserialize;
        return $self;
}

####################### PUBLIC ############################################
# Flags
sub user_dir_flag{
        my $self = shift;
        my $user = shift;
        my $dir = shift;
        return $self->{DATA}->{$user}->{$dir};
}
# Flag sezten
sub flag{
        my($self, $user, $dir, $flag) = @_;
        $self->{DATA}->{$user}->{$dir} = $flag;
}
# Datei speichern, serialize
sub store{
        my $self = shift;
        my $fh = $self->{FH};

        truncate $fh, 0;
        seek $fh, 0,0;
        
        # Erste Zeile muss stimmem
        # print in das handle
        print $fh "$self->{FIRSTLINE}\n";
        
        
        # den ersten Key aus Data löschen
        delete $self->{DATA}->{$self->{FIRSTKEY}};

        # $key ist der Benutzer
        foreach my $key(sort keys %{$self->{DATA}}){
                # Zeile wieder ordnungsgemäß zusammenbauen
                my @record = (); # später join ";"
                push @record, $key;
                for( my $col = 1; $col < scalar(keys %{$self->{COLS}}); $col++){
                        push @record, $self->{DATA}->{$key}->{$self->{COLS}->{$col}};
                }
                print $fh join(";", @record)."\n";
        }       
}
############################################# PRIVATE #####################
sub _handle{
        my $file = shift;
        my $fh = new IO::File $file, O_RDWR;
        return defined $fh ? $fh : undef;     # IO-Error in $!
}
###########################################################################
# Lesen der Daten auf eine Datenstruktur
sub _deserialize{
        my $self = shift;
        my $fh = $self->{FH};
        while(my $line = <$fh>){
                chomp $line;
                my @record = split ";", $line;
                # Spaltennamen aus der ersten Zeile ermitteln
                if($. == 1){
                        $self->{FIRSTLINE} = $line;
                        $self->{FIRSTKEY} = $record[0];
                        for(my $i = 0; $i < scalar @record; $i++){
                                $self->{COLS}->{$i} = $record[$i];
                        }
                }
                my $name = Names->new($self->{COLS}, \@record);
                $self->{DATA}->{$record[0]} = $name; # Key ist der Benutzername
        }
}

1;#########################################################################
package main;

my $ref = CSV->new('userdirs.csv');


# einen Wert setzen
$ref->flag('otto', '/home', 0);

print $ref->user_dir_flag('otto','/home'), "\n";
print $ref->user_dir_flag('otto','/home/test'), "\n";
print $ref->user_dir_flag('otto','/home/bin'), "\n";

# Alles wieder speichern
$ref->store;

View full thread CSV-Datei ohne Modul schreiben