Problem bei Datei"auswertung"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Hiho Gemeinde,

ich hab mal 'ne kleine Frage... Ich bin grad dabei einen OPAC für die Bibliothek unserer Schule zu programmieren. Dabei möchte ich natürlich die alte "Datenbank" mit dem Bestand von etwa 16.000 Büchern übernehmen. Wäre von Hand natürlich eine Arbeit von Wochen. Also, hab ich mal fix ein Backup gezogen (3 Disketten unkomprimiertes Material). Nach etwas bereinigen von Leerzeichen und unwichtigen Daten habe ich etwa folgende Ausgabe:
97/456 Ranft-Schinke, Dagmar: Bilderwelten Scheinwelten?/ Hrsg. Dagmar Ranft-Schinke Dagmar Ranft-Schinke. Regenstauf: Hofmann-Druck, 1996. - 72 S.
97/455 Ranft-Schinke, Dagmar: Bilderwelten Scheinwelten?: Radierungen/ Hrsg. Dagmar Ranft-Schinke Dagmar Ranft-Schinke. Meiáen: Meiáner Druckhaus GmbH, 1993. - 56 S.
97/512 Sチdwestsachsen. Eine Region im Wandel. Chemnitz: Regierungsprトsidium, 106 S. ISBN 3-44241533 -0
Erstmal gibt's da das Problem mit den Umlauten, wie kann ich das beheben, geht's nur mit Replace/Reg.sub?

Dann muss ich da den Titel und den Herausgeber rauslesen... Falls eine ISBN gegeben ist, die auch noch...

Hat da jemand 'nen kleinen Tipp für mich wie ich das jetzt am besten parse?

Danke euch, ich bin hier grad echt in 'ner Sackgasse..

MfG
Iopodx
Benutzeravatar
SigMA
User
Beiträge: 181
Registriert: Sonntag 4. April 2004, 13:27
Wohnort: Freiburg
Kontaktdaten:

Splitte es an bestimmten Stellen und such dir dann das richtige raus.

Der Anfang sieht ja immer so aus:

NUMMER Nachname, Vorname: bla bla

Splitte beim ":"

Dann splitest du nach Leerzeichen und überspringst einfach den ersten Block, da das ja die Nummern sind. Das fügste zu einen String zusammen und du bekommst:

Nachname, Vorname


So würde ich das machen

SigMA
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
BlackJack

Iopodx hat geschrieben:Ich bin grad dabei einen OPAC für die Bibliothek unserer Schule zu programmieren. Dabei möchte ich natürlich die alte "Datenbank" mit dem Bestand von etwa 16.000 Büchern übernehmen. Wäre von Hand natürlich eine Arbeit von Wochen. Also, hab ich mal fix ein Backup gezogen (3 Disketten unkomprimiertes Material). Nach etwas bereinigen von Leerzeichen und unwichtigen Daten habe ich etwa folgende Ausgabe:
In welchem Format liegt denn das Original vor? Und was heisst bereinigen von Leerzeichen und unwichtigen Daten? Die waren vielleicht wichtig zum eindeutigen aufteilen der Datensätze. Und mit was für einem Programm wurde bisher darauf zugegriffen? Gibt's dazu Quelltext? In welcher Programmiersprache wurde es geschrieben?
97/456 Ranft-Schinke, Dagmar: Bilderwelten Scheinwelten?/ Hrsg. Dagmar Ranft-Schinke Dagmar Ranft-Schinke. Regenstauf: Hofmann-Druck, 1996. - 72 S.
97/455 Ranft-Schinke, Dagmar: Bilderwelten Scheinwelten?: Radierungen/ Hrsg. Dagmar Ranft-Schinke Dagmar Ranft-Schinke. Meiáen: Meiáner Druckhaus GmbH, 1993. - 56 S.
97/512 Sチdwestsachsen. Eine Region im Wandel. Chemnitz: Regierungsprトsidium, 106 S. ISBN 3-44241533 -0
Erstmal gibt's da das Problem mit den Umlauten, wie kann ich das beheben, geht's nur mit Replace/Reg.sub?
Nein, Du musst herausfinden in welcher Kodierung bisher gearbeitet wurde und dann mit `decode()` in Unicode-Zeichenketten umwandeln und die dann mit `encode()` in die jetzt gewünschte Kodierung. Wenn es in eine Datenbank soll, dann kannst Du je nach Datenbank dort auch Kodierungseinstellungen vornehmen und evt. der DB direkt Unicode-Zeichenketten übergeben.

Wenn ich raten müsste, würde ich bei der Kodierung auf 'cp850' oder etwas in der Richtung tippen. Damit wird jedenfalls aus "Meiáen" -> Meißen.
Dann muss ich da den Titel und den Herausgeber rauslesen... Falls eine ISBN gegeben ist, die auch noch...
Das ginge mehr oder weniger zuverlässig mit regulären Ausdrücken, aber Du solltest wirklich erst einmal herausfinden, wie das Orginalprogramm diese Daten ausgelesen hat. Das muss einfacher und zuverlässiger als mit RegExps gehen.
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Danke erstmal:

http://iopodx.de/test.txt

Zu dem Programm selbst weiß ich nichts, außer dass es steinalt und DOS ist...

@BlackJack: cp850 - Hundert Punkte. Hab schon UTF-8 und sowas probiert, damit gings nicht =)

MfG
Iopodx
BlackJack

Iopodx hat geschrieben:Danke erstmal:

http://iopodx.de/test.txt

Zu dem Programm selbst weiß ich nichts, außer dass es steinalt und DOS ist...
Hm:

Code: Alles auswählen

$ file test.dat
test.dat: DBase 3 data file (538970913 records)
Das sieht nach einer DBase Datenbank aus. Das Original hat nicht zufällig '.dbf' als Dateiendung? Die kannst Du zum Beispiel mit OpenOffice oder Excel öffnen oder unter Windows über ODBC als Datenbank verfügbar machen.

Ansonsten ist das Löschen der Leerzeichen keine gute Idee, weil DBase feste Satzgrössen hat, d.h. jedes Feld hat eine feste Länge die mit Leerzeichen aufgefüllt ist. In der Datei scheint ein Datensatz immer genau 425 Bytes lang zu sein.
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Wenn ich das ganze mit Excel/OOo öffne, dann geht das paar Zeilen gut, und dann wieder nicht mehr. Außerdem hab ich dann immer nur die Nummer in einer Spalte, und den Rest... :/ Scheint früher keine Trennung zwischen den Kriterien gegeben zu haben..

Und jedes Feld mit 425Bytes geht auch irgendwie net soo richtig, oder?

MfG
Iopodx
Zuletzt geändert von Iopodx am Sonntag 5. November 2006, 13:24, insgesamt 1-mal geändert.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Lässt sich nicht eine alte DBase-Version auftreiben, die die Datei öffnen und in ein neutraleres Format exportieren kann?
BlackJack

Iopodx hat geschrieben:Wenn ich das ganze mit Excel/OOo öffne, dann geht das paar Zeilen gut, und dann wieder nicht mehr. Außerdem hab ich dann immer nur die Nummer in einer Spalte, und den Rest... :/ Scheint früher keine Trennung zwischen den Kriterien gegeben zu haben..
In DBase Dateien steht am Anfang die Struktur der Tabelle. Im Hexeditor sind die Spaltennamen `ZUGNR`, `TITEL1`, `TITEL2` und `N` zu lesen:

Code: Alles auswählen

0000:0020 5a 55 47 4e 52 20 af 04 81 19 20 43 70 56 01 20 ZUGNR ¯... CpV. 
0000:0030 08 20 dc 64 6c 61 a8 21 29 45 01 20 dc 64 7c 61 . Üdla¨!)E. Üd|a
0000:0040 54 49 54 45 4c 31 20 04 81 19 20 43 70 56 01 20 TITEL1 ... CpV. 
0000:0050 f0 20 dc 64 6c 61 a8 21 29 45 01 20 dc 64 7c 61 ð Üdla¨!)E. Üd|a
0000:0060 54 49 54 45 4c 32 20 04 81 19 20 43 70 56 01 20 TITEL2 ... CpV. 
0000:0070 50 20 dc 64 6c 61 a8 21 29 45 01 20 dc 64 7c 61 P Üdla¨!)E. Üd|a
0000:0080 4e 20 54 45 4c 32 20 04 81 19 20 43 70 56 01 20 N TEL2 ... CpV. 
0000:0090 60 20 dc 64 6c 61 a8 21 29 45 01 20 dc 64 7c 61 ` Üdla¨!)E. Üd|a
Das erste Byte in der Zeile unter dem Namen scheint die Feldlänge in Bytes zu sein.
Und jedes Feld mit 425Bytes geht auch irgendwie net soo richtig, oder?
Wenn man die Feldlängen da oben zusammenrechnet kommt man auf 424 Bytes:

Code: Alles auswählen

In [29]: 0x08 + 0xf0 + 0x50 + 0x60
Out[29]: 424
DBase hat aber pro Datensatz noch ein Flag gespeichert, ob der entsprechende Datensatz gültig ist, oder gelöscht. So kann man Datensätze mitten aus der Datei herauslöschen ohne die ganze Datei umschreiben zu müssen.

Und zumindest in dem kleinen Ausschnitt stimmt's, da habe ich immer von der ersten Ziffer von den Nummern der Form "97/456" zur nächsten "gemessen". Das waren immer 425 Bytes.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Über die entsprechende Wikipedia-Seite gelangt man zur Xbase ( & dBASE ) File Format Description und findet da wiederum die hier vermutlich hilfreiche dBASE Specifications.

Code: Alles auswählen

                                    dBASE II        dBASE III       dBASE IV
Max. no. of records                 65,535          1,000,000,000   1,000,000,000
Max. fields per record              32              128             255
Max. data files open                                10              10
Max. index files per open database                  7               47
Max. record size in bytes           1,000           4,000           4,000
Max. records per file                               65,535
Max. bytes per file                                 8,000,000
[...]
No. of data types                                   5               6
Max. size of MEMO file                              5000 bytes      64000 bytes
Max. character field size in bytes  254             254             254
Max. numerical field size in bytes                  19              20
Size of logical field               1 byte          1 byte          1 byte
Size of date field                                  8 bytes         8 bytes
Size of memo pointer in DBF         -               10 bytes
Size of floating point                              -               1-2
Size of decimal values in numeric   10              15
Antworten