22. April 2012: Kleiner Einblick in aktuellen Zwischenstand Programmierung

Dipl.-Kfm. Winfried Sobottka

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

          

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ausgangspunkt: 1.355 erstklassige Datensätze von Rechtsanwältinnen aus diversen Städten, aufwändig mit P & C in eine Textdatei gestellt. Ein "Datensatz" sah z.B. so aus:

        

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Das folgende Programm, aus dem Handgelenk und nicht unbedingt vorzeigbar  strukturiert geschrieben, stellte dann alles in eine unsortierte Datei:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Dann baute ein weiteres Programm mir den Feldinhalt eines Zusatzfeldes zusammen, der sich aus Nachnamen, Trennzeichen (Chr$(0)) und Vornamen zusammensetzt. Nach dem Inhalt dieses Feldes kann alphabetisch nach Namen sortiert werden. 

Dann standen 1.355 Datensätze immer noch unsortiert in einer Datei. Ich brauchte ein gut strukturiertes und gut dokumentiertes Programm, das alle wichtigen Subroutines enthielt, um mit wenig Aufwand beliebige Selektionen und Sortierungen durchzuführen, und baute gleich eine einfache Sortierung ein. Sie ist erstens primitv, zweitens nicht hinsichtlich der Geschwindigkeit optimiert  - vor jedem Lesen und jedem Schreiben erfolgt ein "OPEN", nach dem Lesen bzw. Schreiben ein "Close":

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Das Programm brauchte in der kompilierten Version fast exakt 6 Minuten, dann war die Datei nach dem Sortiernamen sortiert. Das ist nicht gerade blitzschnell, aber anderes hatte ich auch nicht erwartet:

Der eigentlich Sortieralgorithmus ist banal und war in zwei Minuten geschrieben:

8 for satzstart%=1 to anzahl-1:
10 vergl$=chr$(255): for satz%=satzstart% to anzahl: datafileread$="sdata.all":GOSUB 40000:
12 verglx$=daten$(1,28): if verglx$<vergl$ then vergl$=verglx$:satzx%=satz%
13 next satz%
14 snr%=satzstart%+3:datafileread$="sdata.all":gosub 42000:tauschhoch$=gelesen$
15 snr%=satzx%+3:datafileread$="sdata.all":gosub 42000:tauschdown$=gelesen$
16 snr%=satzx%+3:zuschreiben$=tauschhoch$:datafilewrite$="sdata.all":gosub 43000
17 snr%=satzstart%+3:zuschreiben$=tauschdown$:datafilewrite$="sdata.all":gosub 43000
18 next satzstart%
20 print a, timer, timer-a:input o

Es werden ganze Sätze ausgetauscht, nicht nur ein Index organisiert - und die Sätze haben eine Länge von 1.024 Bytes. Dabei muss jeder Satz beim ersten Lesen zergliedert werden, um an den Sortiernamen heranzukommen (wobei standardmäßig nach allen Feldern zergliedert wird) und vergleichen zu können, nach jedem Durchlauf werden die beiden Tauschpartner nochmals am Stück gelesen und am Stück geschrieben. Millionen Sätze kann man nicht so verarbeiten, dafür muss eine intelligente Indexverwaltung her - deren Programmierung Zeit und möglichst Ruhe vor den gepulsten elektromagnetischen Strahlen und anderen Aufgaben voraussetzte (1 Wochenende in einer Hütte in Sibirien mit 220 Volt Stromanschluss... und einem frischen Bett...)  

Drei Screenshots:   Einblick in data.all (unsortierte Datei), Einblick in sdata.all (sortierte Datei), Zeitmessung des Sortierlaufes.    

PS.: Bei der schnellen Übertragung mit P & C kommt es vor, dass Sätze versehentlich doppelt übertragen werden - Maus scheint zu klemmen, und plötzlich hat man einen Satz doppelt in der Textdatei, was aber zunächst nicht auffällt.  Im zweiten Screenshot - nach dem Sortierlauf - sieht man einen solchen Fall ganz unten. Ein Programm, um  doppelte Sätze aus einer sortierten Datei hinauszuwerfen, ist in zwei Minuten geschrieben....            

Berufsbezeichnung:  Rechtsanwältin 
Vorname, Name:  Regine Herscher 
Datum der Zulassung:  22.12.1989 
Adresse der Kanzlei:  Brückstr. 20-26
44135 Dortmund 
Kammerzugehörigkeit:  Rechtsanwaltskammer für den Oberlandesgerichtsbezirk Hamm
 
Kontaktdaten 
 
Telefon:  0231-950374-0 
Telefax:  0231-95037422 
Email:  kontakt@ra-herscher.de 
 
 
 
 Zweigstelle 
 
Adresse:  Brandtstr. 27
45127 Essen 
Telefon:  0201-10269951 
Telefax:  0201-10269952 
 
 
 Zweigstelle 
 
Adresse:  Johannisstr. 66
49074 Osnabrück 
Telefon:  0541-93386886 
Telefax:  0541-93386885 
 
0 DIM daten$(2, 30)
1 feldanzahl% = 28: daten$(2, 1) = "vorname"
2 daten$(2, 2) = "zuname"
3 daten$(2, 3) = "Name"
4 daten$(2, 4) = "titel"
5 daten$(2, 5) = "beruf"
6 daten$(2, 6) = "fachanwalt"
7 daten$(2, 7) = "cofeld"
8 daten$(2, 8) = "strasse"
9 daten$(2, 9) = "plz"
10 daten$(2, 10) = "ort"
11 daten$(2, 11) = "telefon"
12 daten$(2, 12) = "fax"
13 daten$(2, 13) = "email"
14 daten$(2, 14) = zweigstelle$: REM 0,1 oder 2
15 daten$(2, 15) = "strasse"
16 daten$(2, 16) = "z1plz"
17 daten$(2, 17) = "z1ort"
18 daten$(2, 18) = "z1telefon"
19 daten$(2, 19) = "z1telefax"
20 daten$(2, 20) = "z2strasse"
21 daten$(2, 21) = "z2plz"
22 daten$(2, 22) = "z2ort"
23 daten$(2, 23) = "z2telefon"
24 daten$(2, 24) = "z2telefax"
25 daten$(2, 25) = "kammer"
26 daten$(2, 26) = "datum"
27 daten$(2, 27) = "Interessen"
28 daten$(2, 28) = "Sortname"
50 REM
60 REM
70 OPEN "gesamt.txt" FOR INPUT AS #1
75 OPEN "result.txt" FOR OUTPUT AS #2
76 OPEN "result2.txt" FOR OUTPUT AS #3
77 OPEN "data.all" FOR RANDOM AS #4 LEN = 1024: FIELD #4, 1024 AS all$
80 FOR I = 1 TO 20000
100 LINE INPUT #1, D$:
110 IF INSTR(D$, "*ENDE*") THEN I = 25000: GOTO 1000
120 GOSUB 20000
1000 NEXT I: PRINT "ANZAHL:", anzahl: PRINT "Name:", NOMEN: PRINT "cofeld:", COFELD: PRINT "Strasse:", STRASSE: PRINT "ort:", ORT: PRINT "telefon:", TELEFON
1010 PRINT "telefax:", TELEFAX: PRINT "Datum:", DATUM: PRINT "fachanwalt:", FACHANWALT: GOTO 43000: REM ENDE
2000 REM
2100 REM
2200 REM
2300 REM
20000 IF INSTR(D$, "Vorname") = 0 THEN 20100
20010 S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1):
20011 PRINT #2, D$: NOMEN$ = D$: NAMEN$ = NOMEN$: GOSUB 26000: PRINT #2, ZUNOMEN$: PRINT #2, VORNOMEN$: PRINT #2, TITEL$: RETURN: REM                                                                                Vor- und Zuname ggfs. inkl. titel
20100  IF INSTR(D$, "Adresse der Kanzlei:") = 0 THEN 20300
20110  S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): PRINT #2, D$: REM        ADRESSE ggf. inkl. c/o-Feld
20115  CO = 0: IF INSTR(D$, "c/o") THEN CO = 1: COFELD$ = D$ ELSE STRASSE$ = D$
20116 LINE INPUT #1, D$: PRINT #2, D$: IF CO = 0 THEN ORT$ = D$: RETURN ELSE STRASSE$ = D$
20120 LINE INPUT #1, D$: PRINT #2, D$: ORT$ = D$: RETURN
20300 IF INSTR(D$, "Telefon:") = 0 THEN 20400
20310 S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): PRINT #2, D$: TELEFON$ = D$: RETURN: REM                 Telefon  
20400 IF INSTR(D$, "Telefax:") = 0 THEN 20500
20410 S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): PRINT #2, D$: TELEFAX$ = D$: RETURN: REM                 Telefax
20500 IF INSTR(D$, "Email:") = 0 THEN 20600
20510 S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): PRINT #2, D$: EMAIL$ = D$: RETURN: REM                   EMAIL
20600 IF INSTR(D$, "Datum der Zulassung:") = 0 THEN 20700
20610 S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): PRINT #2, D$: DATUM$ = D$: RETURN: REM                 Datum der Zulassung
20700 IF INSTR(D$, "Fachan") = 0 THEN 20800
20710 PRINT #2, D$: FACHANWALT$ = FACHANWALT$ + D$: RETURN: REM                                                                                             Fachanwalt$
20800 IF INSTR(D$, "Rechtsanw") = 0 THEN 20801 ELSE IF INSTR(D$, "kammer") = 0 THEN PRINT #2, D$: BERUF$ = D$: RETURN: REM                                    Rechtsanwalt o. -amwältin 
20801 IF INSTR(D$, "kammer") THEN PRINT #2, D$: KAMMER$ = D$
20850 IF INSTR(D$, "Zweigstelle") = 0 THEN 20950 ELSE GOSUB 25000: REM                                                                                             FACHANW
20950 IF INSTR(D$, "*") THEN PRINT #2, D$: anzahl = anzahl + 1: GOSUB 30000: RETURN
20999 RETURN
24000 REM
24010 REM
24020 REM
24030 REM
25000 IF zweigstelle = 0 THEN zweigstelle = 1
25001 LINE INPUT #1, D$: LINE INPUT #1, D$: IF INSTR(D$, "Adresse:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z1STRASSE$ = D$: PRINT #2, D$
25002 LINE INPUT #1, D$: Z1ORT$ = D$: PRINT #2, D$
25003 LINE INPUT #1, D$: IF INSTR(D$, "*") THEN RETURN 20950
25004 IF INSTR(D$, "Telefon:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z1TELEFON$ = D$: PRINT #2, D$: GOTO 25002
25005 IF INSTR(D$, "Telefax:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z1TELEFAX$ = D$: PRINT #2, D$
25006 IF INSTR(D$, "Zweigstelle") THEN 25020
25007 GOTO 25003
25020 LINE INPUT #1, D$: LINE INPUT #1, D$: IF INSTR(D$, "Adresse:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z2STRASSE$ = D$: PRINT #2, D$
25021 LINE INPUT #1, D$: Z2ORT$ = D$: PRINT #2, D$
25022 LINE INPUT #1, D$: IF INSTR(D$, "*") THEN RETURN 20950
25023 IF INSTR(D$, "Telefon:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z2TELEFON$ = D$: PRINT #2, D$: GOTO 25022
25024 IF INSTR(D$, "Telefax:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z2TELEFAX$ = D$: PRINT #2, D$
25025 IF INSTR(D$, "Zweigstelle") THEN zweigstelle = 2: GOTO 25030
25026 GOTO 25022
25030 LINE INPUT #1, D$: LINE INPUT #1, D$: IF INSTR(D$, "Adresse:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z3STRASSE$ = D$: PRINT #2, D$
25031 LINE INPUT #1, D$: Z3ORT$ = D$: PRINT #2, D$
25032 LINE INPUT #1, D$: IF INSTR(D$, "*") THEN RETURN 20950
25033 IF INSTR(D$, "Telefon:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z3TELEFON$ = D$: PRINT #2, D$: GOTO 25032
25034 IF INSTR(D$, "Telefax:") THEN S% = INSTR(D$, ":"): D$ = RIGHT$(D$, LEN(D$) - S% - 1): Z3TELEFAX$ = D$: PRINT #2, D$
25035 IF INSTR(D$, "Zweigstelle") THEN 25040
25036 GOTO 25032
25040 RETURN
25100 REM
25200 REM
25300 REM
25400 REM
26000 REM aufteilung nomen$ in vornomen$ und zunomen$
26010 VORNOMEN$ = "": ZUNOMEN$ = "": WHILE RIGHT$(NOMEN$, 1) = CHR$(32): NOMEN$ = LEFT$(NOMEN$, LEN(NOMEN$) - 1): WEND
26020 TEST% = LEN(NOMEN$): WHILE MID$(NOMEN$, TEST%, 1) <> CHR$(32): E$ = MID$(NOMEN$, TEST%, 1): ZUNOMEN$ = ZUNOMEN$ + E$: TEST% = TEST% - 1: WEND
26030 X$ = "": FOR TT% = LEN(ZUNOMEN$) TO 1 STEP -1: X$ = X$ + MID$(ZUNOMEN$, TT%, 1): NEXT TT%: ZUNOMEN$ = X$
26040 S% = INSTR(NOMEN$, ZUNOMEN$): VORNOMEN$ = LEFT$(NOMEN$, S% - 2): WHILE RIGHT$(VORNOMEN$, 1) = CHR$(32): VORNOMEN$ = LEFT$(VORNOMEN$, LEN(VORNOMEN$) - 1): WEND
26050 WHILE LEFT$(VORNOMEN$, 1) = CHR$(32): VORNOMEN$ = RIGHT$(VORNOMEN$, LEN(VORNOMEN$) - 1): WEND
26060 S% = 1: yes=0:STELLE% = 1: WHILE S% > 0: S% = INSTR(Stelle%, VORNOMEN$, "."):if s% then yes=1
26070 IF S% > STELLE% THEN STELLE% = S% ELSE S% = 0
26080 WEND:if yes=0 then stelle%=0
26090 IF STELLE% THEN TITEL$ = titel$+LEFT$(VORNOMEN$, STELLE%): VORNOMEN$ = RIGHT$(VORNOMEN$, LEN(VORNOMEN$) - STELLE%)
26081 if instr(vornomen$,".") then 26060
26100 RETURN
29100 REM
29200 REM
29300 REM
29400 REM
30000 REM satz schreiben als textdatei
30050 IF LEN(NOMEN$) > NOMEN THEN NOMEN = LEN(NOMEN$)
30100 IF LEN(COFELD$) > COFELD THEN COFELD = LEN(COFELD$)
30200 IF LEN(STRASSE$) > STRASSE THEN STRASSE = LEN(STRASSE$)
30300 IF LEN(ORT$) > ORT THEN ORT = LEN(ORT$)
30400 IF LEN(TELEFON$) > TELEFON THEN TELEFON = LEN(TELEFON$)
30450 IF LEN(TELEFAX$) > TELEFAX THEN TELEFAX = LEN(TELEFAX$)
30500 IF LEN(EMAIL$) > EMAIL THEN EMAIL = LEN(EMAIL$)
30600 IF LEN(DATUM$) > DATUM THEN DATUM = LEN(DATUM$)
30700 IF LEN(FACHANWALT$) > FACHANWALT THEN FACHANWALT = LEN(FACHANWALT$)
30710 REM PRINT #3,beruf$:PRINT #3,FACHANWALT$:PRINT #3,NOMEN$:PRINT #3,COFELD$:PRINT #3,STRASSE$:PRINT #3,ORT$:
30711 REM PRINT #3,TELEFON$:PRINT #3,TELEFAX$:PRINT #3,EMAIL$
30715 REM PRINT #3,Z1STRASSE$:PRINT #3,Z1ORT$:PRINT #3,Z1TELEFON$:PRINT #3,Z1TELEFAX$
30716 REM PRINT #3,Z2STRASSE$:PRINT #3,Z2ORT$:PRINT #3,Z2TELEFON$:PRINT #3,Z2TELEFAX$
30717 REM PRINT #3,Z3STRASSE$:PRINT #3,Z3ORT$:PRINT #3,Z3TELEFON$:PRINT #3,Z3TELEFAX$
30800 GOSUB 40000: GOSUB 41000: REM                                                                             BEREINIGEN, SELEKTIEREN UND ABSTELLEN  DER DATEN
30803 NOMEN$ = "": COFELD$ = "": STRASSE$ = "": ORT$ = "": TELEFON$ = "": TELEFAX$ = "": KAMMER$ = "": EMAIL$ = "": DATUM$ = "":
30805 FACHANWALT$ = "": BERUF$ = "": TITEL$ = "": VORNOMEN$ = "": ZUNOMEN$ = ""
30810 Z1STRASSE$ = "": Z1ORT$ = "": Z1TELEFON$ = "": Z1TELEFAX$ = ""
30811 Z2STRASSE$ = "": Z2ORT$ = "": Z2TELEFON$ = "": Z2TELEFAX$ = ""
30812 Z3STRASSE$ = "": Z3ORT$ = "": Z3TELEFON$ = "": Z3TELEFAX$ = "": zweigstelle = 0: zweigstelle$ = ""
30850 RETURN
35000 REM
35100 REM
35200 REM
35300 REM
38803 REM NOMEN$="":COFELD$="":STRASSE$="":ORT$="":TELEFON$="":TELEFAX$="":KAMMER$="":EMAIL$="":DATUM$="":
38805 REM FACHANWALT$="":beruf$="":TITEL$="":VORNOMEN$="":ZUNOMEN$=""
38810 REM Z1STRASSE$="":Z1ORT$="":Z1TELEFON$="":Z1TELEFAX$=""
38811 REM Z2STRASSE$="":Z2ORT$="":Z2TELEFON$="":Z2TELEFAX$=""
38812 REM Z3STRASSE$="":Z3ORT$="":Z3TELEFON$="":Z3TELEFAX$=""
40000 REM ***************************************************************************++
40001 WHILE LEFT$(VORNOMEN$, 1) = CHR$(32): VORNOMEN$ = RIGHT$(VORNOMEN$, LEN(VORNOMEN$) - 1): WEND
40002 WHILE RIGHT$(VORNOMEN$, 1) = CHR$(32): VORNOMEN$ = LEFT$(VORNOMEN$, LEN(VORNOMEN$) - 1): WEND
40003 WHILE LEFT$(ZUNOMEN$, 1) = CHR$(32): ZUNOMEN$ = RIGHT$(ZUNOMEN$, LEN(ZUNOMEN$) - 1): WEND
40004 WHILE RIGHT$(ZUNOMEN$, 1) = CHR$(32): ZUNOMEN$ = LEFT$(ZUNOMEN$, LEN(ZUNOMEN$) - 1): WEND
40005 WHILE LEFT$(COFELD$, 1) = CHR$(32): COFELD$ = RIGHT$(COFELD$, LEN(COFELD$) - 1): WEND
40006 WHILE RIGHT$(COFELD$, 1) = CHR$(32): COFELD$ = LEFT$(COFELD$, LEN(COFELD$) - 1): WEND
40007 WHILE LEFT$(STRASSE$, 1) = CHR$(32): STRASSE$ = RIGHT$(STRASSE$, LEN(STRASSE$) - 1): WEND
40008 WHILE RIGHT$(STRASSE$, 1) = CHR$(32): STRASSE$ = LEFT$(STRASSE$, LEN(STRASSE$) - 1): WEND
40010 PLZ = VAL(left$(ORT$,7)): PRINT PLZ: PLZ$ = STR$(PLZ): PLZ$ = RIGHT$(PLZ$, LEN(PLZ$) - 1)
40020  S% = INSTR(ORT$, PLZ$) + LEN(PLZ$): ORT$ = RIGHT$(ORT$, LEN(ORT$) - S%)
40030 IF VAL(Z1ORT$) = 0 THEN 40050 ELSE Z1PLZ = VAL(left$(Z1ORT$,7)): PRINT Z1PLZ: Z1PLZ$ = STR$(Z1PLZ): Z1PLZ$ = RIGHT$(Z1PLZ$, LEN(Z1PLZ$) - 1)
40040  S% = INSTR(Z1ORT$, Z1PLZ$) + LEN(Z1PLZ$): Z1ORT$ = RIGHT$(Z1ORT$, LEN(Z1ORT$) - S%)
40050 IF VAL(Z2ORT$) = 0 THEN 40070 ELSE Z2PLZ = VAL(left$(Z2ORT$,7)): PRINT Z2PLZ: Z2PLZ$ = STR$(Z2PLZ): Z2PLZ$ = RIGHT$(Z2PLZ$, LEN(Z2PLZ$) - 1)
40060  S% = INSTR(Z2ORT$, Z2PLZ$) + LEN(Z2PLZ$): Z2ORT$ = RIGHT$(Z2ORT$, LEN(Z2ORT$) - S%)
40070 IF LEN(Z1STRASSE$) = 0 THEN 40080
40075 WHILE LEFT$(Z1STRASSE$, 1) = CHR$(32): Z1STRASSE$ = RIGHT$(Z1STRASSE$, LEN(Z1STRASSE$) - 1): WEND
40077 WHILE RIGHT$(Z1STRASSE$, 1) = CHR$(32): Z1STRASSE$ = LEFT$(Z1STRASSE$, LEN(Z1STRASSE$) - 1): WEND
40080 IF LEN(Z2STRASSE$) = 0 THEN 40090
40085 WHILE LEFT$(Z2STRASSE$, 1) = CHR$(32): Z2STRASSE$ = RIGHT$(Z2STRASSE$, LEN(Z2STRASSE$) - 1): WEND
40087 WHILE RIGHT$(Z2STRASSE$, 1) = CHR$(32): Z2STRASSE$ = LEFT$(Z2STRASSE$, LEN(Z2STRASSE$) - 1): WEND
40090 IF LEN(TELEFON$) = 0 THEN 40093
40091 WHILE LEFT$(TELEFON$, 1) = CHR$(32): TELEFON$ = RIGHT$(TELEFON$, LEN(TELEFON$) - 1): WEND
40092 WHILE RIGHT$(TELEFON$, 1) = CHR$(32): TELEFON$ = LEFT$(TELEFON$, LEN(TELEFON$) - 1): WEND
40093 IF LEN(Z1TELEFON$) = 0 THEN 40096
40094 WHILE LEFT$(Z1TELEFON$, 1) = CHR$(32): Z1TELEFON$ = RIGHT$(Z1TELEFON$, LEN(Z1TELEFON$) - 1): WEND
40095 WHILE RIGHT$(Z1TELEFON$, 1) = CHR$(32): Z1TELEFON$ = LEFT$(Z1TELEFON$, LEN(Z1TELEFON$) - 1): WEND
40096 IF LEN(Z2TELEFON$) = 0 THEN 40099
40097 WHILE LEFT$(Z2TELEFON$, 1) = CHR$(32): Z2TELEFON$ = RIGHT$(Z2TELEFON$, LEN(Z2TELEFON$) - 1): WEND
40098 WHILE RIGHT$(Z2TELEFON$, 1) = CHR$(32): Z2TELEFON$ = LEFT$(Z2TELEFON$, LEN(Z2TELEFON$) - 1): WEND
40099 IF LEN(TELEFAX$) = 0 THEN 40102
40100 WHILE LEFT$(TELEFAX$, 1) = CHR$(32): TELEFAX$ = RIGHT$(TELEFAX$, LEN(TELEFAX$) - 1): WEND
40101 WHILE RIGHT$(TELEFAX$, 1) = CHR$(32): TELEFAX$ = LEFT$(TELEFAX$, LEN(TELEFAX$) - 1): WEND
40102 IF LEN(Z1TELEFAX$) = 0 THEN 40105
40103 WHILE LEFT$(Z1TELEFAX$, 1) = CHR$(32): Z1TELEFAX$ = RIGHT$(Z1TELEFAX$, LEN(Z1TELEFAX$) - 1): WEND
40104 WHILE RIGHT$(Z1TELEFAX$, 1) = CHR$(32): Z1TELEFAX$ = LEFT$(Z1TELEFAX$, LEN(Z1TELEFAX$) - 1): WEND
40105 IF LEN(Z2TELEFAX$) = 0 THEN 40108
40106 WHILE LEFT$(Z2TELEFAX$, 1) = CHR$(32): Z2TELEFAX$ = RIGHT$(Z2TELEFAX$, LEN(Z2TELEFAX$) - 1): WEND
40107 WHILE RIGHT$(Z2TELEFAX$, 1) = CHR$(32): Z2TELEFAX$ = LEFT$(Z2TELEFAX$, LEN(Z2TELEFAX$) - 1): WEND
40108 KAMMER$ = "Hamm"
40109 WHILE LEFT$(DATUM$, 1) = CHR$(32): DATUM$ = RIGHT$(DATUM$, LEN(DATUM$) - 1): WEND
40110 WHILE RIGHT$(DATUM$, 1) = CHR$(32): DATUM$ = LEFT$(DATUM$, LEN(DATUM$) - 1): WEND
40111 WHILE LEFT$(NOMEN$, 1) = CHR$(32): NOMEN$ = RIGHT$(NOMEN$, LEN(NOMEN$) - 1): WEND
40112 WHILE RIGHT$(NOMEN$, 1) = CHR$(32): NOMEN$ = LEFT$(NOMEN$, LEN(NOMEN$) - 1): WEND
40113 S% = INSTR(BERUF$, ":"): IF S% THEN BERUF$ = RIGHT$(BERUF$, LEN(BERUF$) - S%)
40114 WHILE LEFT$(BERUF$, 1) = CHR$(32): BERUF$ = RIGHT$(BERUF$, LEN(BERUF$) - 1): WEND
40115 WHILE RIGHT$(BERUF$, 1) = CHR$(32): BERUF$ = LEFT$(BERUF$, LEN(BERUF$) - 1): WEND
40117 zweigstelle$ = RIGHT$(STR$(zweigstelle), LEN(STR$(zweigstelle)) - 1)
40123 RETURN
41000 daten$(1, 1) = VORNOMEN$
41002 daten$(1, 2) = ZUNOMEN$
41003 daten$(1, 3) = NOMEN$
41004 daten$(1, 4) = TITEL$
41005 daten$(1, 5) = BERUF$
41006 daten$(1, 6) = FACHANWALT$
41007 daten$(1, 7) = COFELD$
41008 daten$(1, 8) = STRASSE$
41009 daten$(1, 9) = PLZ$
41010 daten$(1, 10) = ORT$
41011 daten$(1, 11) = TELEFON$
41012 daten$(1, 12) = TELEFAX$
41013 daten$(1, 13) = EMAIL$
41014 daten$(1, 14) = zweigstelle$: REM 0,1 oder 2
41015 daten$(1, 15) = Z1STRASSE$
41016 daten$(1, 16) = Z1PLZ$
41017 daten$(1, 17) = Z1ORT$
41018 daten$(1, 18) = Z1TELEFON$
41019 daten$(1, 19) = Z1TELEFAX$
41020 daten$(1, 20) = Z2STRASSE$
41021 daten$(1, 21) = Z2PLZ$
41022 daten$(1, 22) = Z2ORT$
41023 daten$(1, 23) = Z2TELEFON$
41024 daten$(1, 24) = Z2TELEFAX$
41025 daten$(1, 25) = KAMMER$
41026 daten$(1, 26) = DATUM$
41027 daten$(1, 27) = "Interessen"
41028 daten$(1, 28) = "Sortname"
41029 daten$(1,29)="DUMMY"
41100 SATZLEN = 0: FOR ppr = 1 TO feldanzahl%:
41101 IF LEN(daten$(1, ppr)) THEN PRINT #3, daten$(1, ppr): SATZLEN = SATZLEN + LEN(daten$(1, ppr))
41102 : NEXT ppr: IF GESAMT < SATZLEN THEN GESAMT = SATZLEN
41103 PRINT #3, "**********************"
41104 REM
41105 REM
41110 xx$ = "": satz% = satz% + 1: FOR ppr% = 1 TO feldanzahl%
41120  feld$ = RIGHT$(STR$(ppr%), LEN(STR$(ppr%)) - 1): feld$ = CHR$(255) + feld$ + CHR$(255)
41130 xx$ = xx$ + feld$ + daten$(1, ppr%)
41150 NEXT ppr%
41170  feld$ = RIGHT$(STR$(feldanzahl% + 1), LEN(STR$(feldanzahl% + 1)) - 1): feld$ = CHR$(255) + feld$ + CHR$(255)
41180 xx$ = xx$ + feld$
41200 LSET all$ = xx$: PUT #4, satz% + 3
41201 RETURN
42000 REM
43000 REM
43110 xx$ = "":FOR ppr% = 1 TO feldanzahl%
43120  feld$ = RIGHT$(STR$(ppr%), LEN(STR$(ppr%)) - 1): feld$ = CHR$(255) + feld$ + CHR$(255)
43130 xx$ = xx$ + feld$ + daten$(2, ppr%)
43150 NEXT ppr%
43170  feld$ = RIGHT$(STR$(feldanzahl% + 1), LEN(STR$(feldanzahl% + 1)) - 1): feld$ = CHR$(255) + feld$ + CHR$(255)
43180 xx$ = xx$ + feld$
43200 lset all$=xx$:put #4,2:
43300 xx$=space$(1024):lset all$=xx$:put #4, 3
43400 close #4
44000 REM
45000 REM
50000 rem
51000 OPEN "data.all" FOR RANDOM AS #4 LEN = 1024: FIELD #4, 6 AS anzahl$, 6 AS felder$
51100 anz$ = STR$(anzahl): feldz$ = STR$(feldanzahl%)
51200 LSET anzahl$ = anz$: LSET felder$ = feldz$
51300 PUT #4, 1: CLOSE #4
51500 END

0 a=timer: Datafile$="data.all":GOSUB 60300:DIM DATEN$(2,feldanzahl%): REM Einlesen PARAMETER ANZAHL (echter RECORDS) und FELDANZAHL%
5 for snr%=1 to 3: datafileread$="sdata.all":gosub 42000:zuschreiben$=gelesen$:datafilewrite$="sdata.all":gosub 43000:next snr%
8 for satzstart%=1 to anzahl-1:
10 vergl$=chr$(255): for satz%=satzstart% to anzahl: datafileread$="sdata.all":GOSUB 40000:
12 verglx$=daten$(1,28): if verglx$<vergl$ then vergl$=verglx$:satzx%=satz%
13 next satz%
14 snr%=satzstart%+3:datafileread$="sdata.all":gosub 42000:tauschhoch$=gelesen$
15 snr%=satzx%+3:datafileread$="sdata.all":gosub 42000:tauschdown$=gelesen$
16 snr%=satzx%+3:zuschreiben$=tauschhoch$:datafilewrite$="sdata.all":gosub 43000
17 snr%=satzstart%+3:zuschreiben$=tauschdown$:datafilewrite$="sdata.all":gosub 43000
18 next satzstart%
20 print a, timer, timer-a:input o
30 END
40000 REM ***********************     START   -    READ  SATZ and SET  DATEN$(1,*) auf  #5  aus DATAFILE$ LESEN, satz%+3       ************
40200 OPEN DATAFILEREAD$ FOR RANDOM AS #5 LEN = 1024: FIELD #5, 1024 AS all5$
40300 GET #5, satz% + 3
40400 FOR ppr% = 1 TO FELDANZAHL%
40401 s1$ = CHR$(255) + RIGHT$(STR$(ppr%), LEN(STR$(ppr%)) - 1) + CHR$(255): s1len% = LEN(s1$)
40402 s2$ = CHR$(255) + RIGHT$(STR$(ppr% + 1), LEN(STR$(ppr% + 1)) - 1) + CHR$(255): s2len% = LEN(s2$)
40404 s1% = INSTR(all5$, s1$): s2% = INSTR(all5$, s2$)
40406 feld$ = MID$(all5$, s1% + s1len%, s2% - s1%-s1len%): daten$(1, ppr%) = feld$:
40508 NEXT ppr%
40606 CLOSE #5
40706 RETURN
40800 REM ***********************     ENDE   -    READ  SATZ and SET  DATEN$(1,*) auf  #5  aus DATAFILEREAD$ LESEN, satz%+3       ************
40810 rem
40820 rem
41000 rem  ************************     START WRITE daten$(1,*), #4,  SATZ% (echter RECORD)
41020 OPEN DATAFILEWRITE$ FOR RANDOM AS #4 LEN = 1024: FIELD #4, 1024 AS all4$
41110 xx$ = "": FOR ppr% = 1 TO feldanzahl%
41120  feld$ = RIGHT$(STR$(ppr%), LEN(STR$(ppr%)) - 1): feld$ = CHR$(255) + feld$ + CHR$(255)
41130 xx$ = xx$ + feld$ + daten$(1, ppr%)
41150 NEXT ppr%
41180 LSET all4$ = xx$: PUT #4, satz% + 3
41200 close #4
41201 RETURN
41300 rem  *************************    ENDE WRITE daten$(1,*), #4,  SATZ% (echter RECORD)
41310 rem
41320 rem
42000 rem  *************************    START - READ SATZ mit PHYS ADRESSE  SNR% aus DATAFILEREAD$ auf #5 und STELL AB in GELESEN$
42010 OPEN DATAFILEREAD$ FOR RANDOM AS #5 LEN = 1024: FIELD #5, 1024 AS all5$
42012 get #5, snr%: gelesen$=all5$:close #5
42020 return
42030 rem  *************************    ENDE - READ SATZ mit PHYS ADRESSE  SNR% aus DATAFILEREAD$ auf #5 und STELL AB in GELESEN$ 
42310 rem
42320 rem
43000 rem  *************************    START - WRITE SATZ  ZUSCHREIBEN$ mit PHYS ADRESSE  SNR% in DATAFILEWRITE$ auf #4
43010 OPEN DATAFILEWRITE$ FOR RANDOM AS #4 LEN = 1024: FIELD #4, 1024 AS all4$
43012 lset all4$=ZUSCHREIBEN$:put  #4, snr%:close #4
43020 return
43030 rem  *************************    ENDE - WRITE SATZ  ZUSCHREIBEN$ mit PHYS ADRESSE  SNR% in DATAFILEWRITE$ auf #4  
43310 rem
43320 rem
50000 REM
51000 REM
52000 REM
53000 REM
60000 REM    *******************    1rst OPEN and DIM DATEN$, EINLESEN ANZAHL u FELDANZAHL% AUS DATEI
60001 goto 60340: REM *************************        BIS DAHIN NUR ZUR ORIENTIERUNG
60300 REM satzlen =1024
60310 REM     SATZ 1 : 6 anzahl$, 6 feldanzahl$
60320 REM     SATZ 2:  Feldbezeichnungen:     right$(str$(i), len(str$(i))-1) + FELDBEZEICHNUNG für i=1 bis n
60330 REM     SATZ 3 reserviert für Namen von Indexdateien mit Referenz zu Feldern
60340 REM
60350 OPEN DATAFILE$ FOR RANDOM AS #1 LEN = 1024: FIELD #1, 6 AS ANZAHL$, 6 AS FELDANZAHL$: GET #1, 1:
60360 ANZAHL = VAL(ANZAHL$): FELDANZAHL% = VAL(FELDANZAHL$): CLOSE #1:
60400   RETURN: REM ***************************   ENDE  1rst OPEN  EINLESEN ANAZHL und FELDANZAHL% ************