Thread CSV-Datei ohne Modul schreiben
(15 answers)
Opened by Stuermchen at 2011-07-12 09:07
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; |