[Vienna-pm] 8MB Excel-File

Peter J. Holzer hjp at wsr.ac.at
Mon Apr 18 04:07:54 PDT 2005


On 2005-04-18 10:43:39 +0200, Nagy Wilhelm wrote:
> Hallo Peter,
> 
> >Da hilft dann eventuell statt Selberstricken die Verwendung von DBD::CSV
> >oder DBD::AnyFile. Mit ein bisschen Glück sind da solche Sonderfälle
> >bereits implementiert. (Ich hab's nicht ausprobiert)
> 
> Leider nein, da solche 'Sonderfaelle' eben sonderfälle sind.

Es sind aber Fälle, die vom Fileformat abgedeckt werden. Die Frage ist
nur, ob das "Excel-CSV-Fileformat" und das "DBD::CSV-Fileformat" gleich
sind. Bei DBD::AnyFile kann man es sich fast sicher passend
zurechtdefinieren (aber dann ist es auch nicht mehr weniger Arbeit als
selberschreiben).


> Es koennte (und ich betone KOENNTE) die verwendung von 'gequoteten'
> Zelleninhalten
> 
> "eins","zwei"...
> 
> Eien Besserung darstellen. Nur...
> Ich weiss nicht wie ich das Quoten von Zelleninhalten von Excel steuren soll

Das weiß ich allerdings auch nicht. Excel tendiert ein bisschen dazu,
das von der Mondphase abhängig zu machen. (Zumindest behaupten die User
immer, dass sie nichts geändert hätten, wenn das Fileformat wieder mal
anders ist).


> Zelle: und ich sage noch: "tus nicht"   --> "Zelle: und ich sage noch: "tus
> nicht"" 
> und fertig ist die verwirrung.

Dafür gab es schon zu meinen BASIC-Zeiten Lösungen. Excel scheint die
Lösung zu verwenden, die damals aus BASIC verwendet hat:
Anführungszeichen innerhalb eines Strings werden verdoppelt. Aus 
»Zelle: und ich sage noch: "tus nicht"« wird also »"Zelle: und ich sage
noch: ""tus nicht"""«

Zeilenumbrüche innerhalb einer Zelle speichert Excel (Office 2002, SP3)
übrigens als LF, während die nächste Tabellenzeile durch CRLF angezeigt
wird. Wenn es keine Möglichkeit gibt, ein CR einzugeben (ich habe keine
gefunden, aber ich bin auch ein Excel-Dummy), ist das eindeutig.

Das Fileformat ist sicherlich darauf ausgelegt, byteweise gelesen zu
werden. Das ist ein bisschen "unperlisch". Selbst ich als alter
C-Programmierer scheue etwas davor zurück in Perl sowas wie

while (read(F, $c, 1)) {
    if ($c eq '"') {
	...
    } elsif ($c eq "\t") {
	...
    }
    ...
}

zu schreiben. Aber man kann das auch in Regexps gießen, z.B. so:

$/ = "\r\n";
while (<>) {
    @fields = (m/"(?:((?:""|[^"])*?)"|.*?)(?:;|\r\n)/g);
    for (@fields) {
	if (/^"/) {
	    s/^"(.*)"/$1/;
	    s/""/"/g;
	}
    }
    ...
}

(ungetestet)



> Nach ca. 25 Jahren rumschlagen mit diesen Problemen habe ich noch keine
> wirklich "Wasserdichte" Lösung gefunden.

Es gibt etliche wasserdichte Lösungen für das Problem. Die von C
("\ooo") dürfte übrigens mindestens 31 Jahre alt sein. 

Ob die von Excel verwendeten Varianten alle wasserdicht sind, weiß ich
nicht. Vor allem hat man bei Excel das Problem, dass die noch von
irgendwelchen schwer kontrollierbaren Umweltbedingungen (z.B.
Ländereinstellungen) abhängen und vermutlich auch nirgends dokumentiert
sind, so dass man mit der Angabe "Das ist ein von Excel exportiertes
CSV-File" nicht wirklich viel anfangen kann.

> Einzig die Vewendung von Fixed-Records bringt Erleichterung.

Für die Aufgabenstellung "ich möchte beliebige Inhalte in einer Zelle
speichern"? Sicher nicht.

> Ich höhre von Fernen schon die XML Jünger antrampeln. Ums kurz zu machen:
> "Ja es funktioniert".
> Aber aus 8MB werden dann leicht 80 - 160 (Wir habens probiert) und dann
> platzen die Hauptspeicher.

Gut, besonders speicherplatzsparend ist Perl ja auch nicht.


> Ich schlage mich gerade mit einem xml-Schema herum welches nur auf einen A0
> Plotter ausgedruckt werden kann.

An meiner Bürowand hängt ein (Oracle)-Datenbank-Schema, das auch
ungefähr dieses Format hat. Da fehlen aber noch die ganzen Views :-).

	hp

-- 
   _  | Peter J. Holzer \Beta means "we're down to fixing misspelled comments in
|_|_) | Sysadmin WSR     \the source, and you might run into a memory leak if 
| |   | hjp at wsr.ac.at     \you enable embedded haskell as a loadable module and
__/   | http://www.hjp.at/ \write your plugins upside-down in lisp". --ae at op5.se
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 388 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20050418/0cabd6ed/attachment.bin


More information about the Vienna-pm mailing list