[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: csv nach HTML konvertieren



Hi,

um wegen meines Gnumeric-Vorschlags nicht als unsportlicher Feigling zu
erscheinen ;) will ich noch einen Kommentar samt Warnung loswerden.

Tepperis von der Ohe, Michael (LOGICA) hat gesagt: 

> hier ein programm-rahmen. allerdings gibt es ein 
> gutes, hilfreiches html-modul fuer perl.
> $_ ist die aktuelle zeile.
> 
> #!/usr/bin/perl
> [...] 
> while( <FILE> )               # datei einlesen
>  {
>      s/,/<td>/g; 

Die Warnung:
 
 Obiges funktioniert nicht immer, warum s.u.

>      print FILE2 "  <tr><td>$_</tr>\n";
>  } 

Der Kommentar:
 
 Einfach das Komma durch <td> zu ersetzen (wie auch in den
Shell-Lösungen vorgeschlagen), geht dann nicht mehr, wenn in den
csv-Feldern selber Kommas auftauchen dürfen, und das ist zum Beispiel bei
Preisen gar nicht selten. Meist wird dann das Komma geschützt, ala \, oder
der ganze Dateneintrag in "Anführungszeichen" gesetzt. Da kommt die naive
Lösung natürlich aus dem Tritt. 

Man muss also gegebenenfalls vorbereitet sein. Wie man das in der Shell
macht, weiß ich nicht, Python ist leider nicht so populär, daher hier die
Perl-Lösung:

Sie steckt im Modul Text::ParseWords und heißt quotewords. Das Beispiel in
der man-Page:
         
 use Text::ParseWords;
 @words = &quotewords('\s+', 0, q{this   is "a test" of\ quotewords \"for you});
 $i = 0;
 foreach (@words) {
     print "$i: <$_>\n";
     $i++;
 }

gibt aus:

 0: <this>
 1: <is>
 2: <a test>
 3: <of quotewords>
 4: <"for>
 5: <you>

Das ergibt dann diese Funktion, um eine csv-Zeile zu splitten:
 
 $sep = ","; # oder wie auch immer
 
 sub parse_csv {
     my $text = shift;      # record containing comma-separated values
     my @new  = ();
     @new = &quotewords($sep, 0, $text);
     return @new;      # list of values that were comma-separated
 }
 
Stammt glaube ich aus dem Perl-Cookbook, liegt hier so rum...

Damit wird der Loop zu:
 
 while( <FILE> )
 {
   # splitte aktuelle Zeile:
   @data = parse_csv($_);
   # @data weiter verarbeiten
   &Mach_html_aus(@data);
 }

Ciao,
-- 
                                                 __    __
 Frank Barknecht       ____ ______   ____ __ trip\ \  / /wire ______
                      / __// __  /__/ __// // __  \ \/ /  __ \\  ___\	
                     / /  / ____/  / /  / // ____// /\ \\  ___\\____ \	
                    /_/  /_____/  /_/  /_//_____// /  \ \\_____\\_____\
                                                /_/    \_\ 



Reply to: