Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Loadbefehl - Laden von Werten aus Datei

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 06.08.2017, 18:49    Titel: Loadbefehl - Laden von Werten aus Datei Antworten mit Zitat

Ich komme bei einer kleinen Sache irgendwie nicht weiter. Ich habe eine Datei mit Zahlen und Buchstaben. In jeder Zeile sind die Werte durch ein oder mehrere Leerzeichen voneinander getrennt. Die Zeilen haben keine feste Länge. Können also unendlich lang sein. Ich brauche irgendwie eine Lösung, dass ich jeden Wert in einer Zeile einer Variable zuordnen kann? Ich muss irgendwie wissen wie viele Werte in der Datei drin stehen und wo sie sich befinden??? Es kann auch sein, dass zum Beispiel mehr als 1 Leerzeichen zwischen den Werten drinstehen!

Beispiel einer Datei:

Code:
G90    G54 G80    G72.1
T0101 M06               [Werkzeugaufruf T0101]
S1000 F120 M03      (Drehzahl)
G00 X0  Y25 M08
G00 Z5
G01 Z-2 F320
G01 G42 X100 Y35   F1000
...


Beispiel 2:

Code:
001  111 MCM  Te1744789020                       9257 ICE                         9.2    8     5 y 9     4 u 5     4 v 1     8 w #           



Bei Beispiel 2 sollte zum Beispiel "5 y 9" beim einlesen erkannt werden und in seine Einzelteile zerlegt werden! Ich habe keine Idee wie ich bei Beispiel 2 an die Werte rankomme und ich vor allem weiß, um wie viele Elemente es sich handelt. Bei Beispiel 2 wären es 4 Elemente (5 y 9, 4 u 5, 4 v 1, 8 w #) Wie überprüfe ich das Ende einer Zeile? Das ist das, was mir im Moment noch Kopfzerbrechen bereitet?

Vielleicht hat einer eine Idee bzw. Lösung?

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 06.08.2017, 21:04    Titel: Antworten mit Zitat

Das Zeilenende sollte wirklich kein Problem sein. Du liest einfach die komplette Zeile mit LINE INPUT ein; dann ist das Ende der eingelesenen Zeile auch das Ende der Zeile in der Datei.

Die Inhalte sind durch Leerzeichen getrennt, also suchst du in der eingelesenen Zeile nach Leerzeichen (z. B. mit INSTR). Dann kannst du die Zeile schon mal in zwei Teile zerlegen - den vor und den nach dem Leerzeichen, und dann im zweiten Teil z. B. mit TRIM die (führenden) Leerzeichen abschneiden. Damit beginnt dieser zweite Teil direkt mit dem zweiten Wert.

Der zweite Teil wird dann wie oben weiter zerlegt; das wiederholst du so lange, bis du kein Leerzeichen mehr findest. Damit hast du alle Werte ausgelesen (und weißt damit auch, wie viele Werte es waren).

Allerdings, "5 y 9" und "4 u 5" kannst du nicht als zusammenhängend erkennen, wenn das Leerzeichen das Trennzeichen sein soll; außer du kennst die Struktur und fügst es nachher wieder zusammen ("wenn auf eine Zahl ein einzelner Buchstabe und darauf wieder eine Zahl oder ein Hash folgt, dann ..."). Wenn nicht, dann ist das Format (Leerzeichen als Trennzeichen UND als möglicher Inhalt) einfach Mist grinsen .
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 06.08.2017, 21:47    Titel: Antworten mit Zitat

Zitat:
Allerdings, "5 y 9" und "4 u 5" kannst du nicht als zusammenhängend erkennen, wenn das Leerzeichen das Trennzeichen sein soll; außer du kennst die Struktur und fügst es nachher wieder zusammen ("wenn auf eine Zahl ein einzelner Buchstabe und darauf wieder eine Zahl oder ein Hash folgt, dann ...").
Theoretisch ginge das schon. Ich muss halt nur wissen, welche Abschnitt (Abschnitt 1 oder Abschnitt 2, ... Abschnitt 30) das ist. Zusammenhängend muss ich es nicht unbedingt erkennen können. Es reicht wenn ich die Zahl 5 einlese und der entsprechenden Variable zuordnen kann. Genauso ist es mit dem Y und der Zahl 9, sowie den restlichen Werten. Alles muss einer bestimmten Variable zugeordnet werden bzw. können. Wirklich nicht einfach... verwundert Ich verzweifle noch!

Edit:
Wobei! Vermutlich so gemeint/gedacht:

Code:
1. xxx xxx  xx  xxx   x   xx  x   xxx
2. xxx  xx  xxx   x   xx  x   xxx
3. xx  xxx   x   xx  x   xxx
4. xxx   x   xx  x   xxx
5. x   xx  x   xxx
6. xx  x   xxx
7. x   xxx
8. xxx
Ende


Schrittweise Reduzierung des Satzes. Ich muss dann nur noch wissen, wann welcher Wert kommt und den der entsprechenden Variable zuordnen.

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05


Zuletzt bearbeitet von ALWIM am 06.08.2017, 21:58, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 06.08.2017, 21:55    Titel: Antworten mit Zitat

Was meinst du mit "Abschnitt 1", "Abschnitt 2" usw.?

Die Zeile aus Beispiel 2 zu zerlegen in
"001", "111", "MCM", "Te1744789020", "9257", "ICE", "9.2", "8", "5", "y", "9", "4", "u", "5", "4", "v", "1", "8", "w", "#"
ist kein Problem. Wenn die Dinge anders zusammenhängen, solltest du dir zuerst überlegen: Wie erkennst du (nicht das Programm, sondern du als Mensch), welcher Wert in welchen Abschnitt gehört? Danach kannst du versuchen, das als Programm umzusetzen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 06.08.2017, 22:02    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Was meinst du mit "Abschnitt 1", "Abschnitt 2" usw.?

Die Zeile aus Beispiel 2 zu zerlegen in
"001", "111", "MCM", "Te1744789020", "9257", "ICE", "9.2", "8", "5", "y", "9", "4", "u", "5", "4", "v", "1", "8", "w", "#"
ist kein Problem. Wenn die Dinge anders zusammenhängen, solltest du dir zuerst überlegen: Wie erkennst du (nicht das Programm, sondern du als Mensch), welcher Wert in welchen Abschnitt gehört? Danach kannst du versuchen, das als Programm umzusetzen.


Bei "5 y 9" beginne ich mit dem zählen von 1 aufwärts. Also Abschnitt 1!
"4 u 5" wäre dann die 2. Demzufolge Abschnitt 2. Ich muss wissen, welche Nummer "5 y 9" ist.
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 06.08.2017, 22:07    Titel: Antworten mit Zitat

Und woher weißt du, dass der erste Abschnitt "5 y 9" ist und nicht z. B.
Code:
ICE

oder gar
Code:
9     4 u

Entschuldige, wenn die Frage seltsam wirkt; aber genau das ist der Punkt, über den du dir für das Programm klar werden musst.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 06.08.2017, 22:12    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Und woher weißt du, dass der erste Abschnitt ist und nicht z. B.
Code:
ICE

oder gar
Code:
9     4 u

Entschuldige, wenn die Frage seltsam wirkt; aber genau das ist der Punkt, über den du dir für ds Programm klar werden musst.


Code:
5 y 9     4 u 5     4 v 1     8 w #
Diese Werte haben alle das selbe Muster! Deswegen muss ich dort bei "5 y 9" mit dem zählen anfangen! Zum Schluss muss ich sagen können, wie viele von diesen Werten wie "5 y 9" vorhanden sind. Jeder dieser Kombinationen steht für einen Abschnitt!
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 06.08.2017, 22:18    Titel: Antworten mit Zitat

Na, dann passt es doch. lächeln Dann arbeite genau dieses Muster in deinem Programm ab
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 06.08.2017, 22:36    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Na, dann passt es doch. lächeln Dann arbeite genau dieses Muster in deinem Programm ab
Nicht ganz, denn es kann zu sogenannten Sonderfällen kommen, die das gesamte Muster durcheinander bringen können! Mein Plan ist eine TRF-Datei einzulesen. Wie man ja weiß, schreibe ich ein Auslosungsprogramm für Turniere. Wenn ich eine TRF-Datei speichern kann, sollte die auch wieder eingelesen können.

Dass ich da oben ein CNC-Programm mit reingeschrieben habe, liegt daran, dass ich das auch gleich für mein 2. Projekt gebrauchen kann!

Aufbau einer TRF-Datei die eingelesen soll:

Code:
012
022
032
042
052
062 11
072 7
092 Swiss System
102
122
132                                                                                           
XXR 7
001    1 mGM  Testspieler                       2602 VAT                         0.0    0     6 b 1     4 w 1     2 b =     8 w =           
001    2 mGM  Test Oleg                         2600 BUL             00.00.1900  0.0    0     7 w 1     5 b 1     1 w =     3 b =           
001    3 m    Sedlak Ivan                       2074 SRB             00.00.1900  0.0    0     8 b 1    11 w 1     4 b 1     2 w =           
001    4 m    Schmidbauer Sepp                  1799 GER                         0.0    0     9 w 1     1 b 0     3 w 0    10 b 1           
001    5 m    Mustermann Max                    1610 GER  1290111111 04.02.1953  0.0    0    10 b 1     2 w 0    11 b 1     6 w 1           
001    6 m    Test for Arbiter                  1100 VAT                         0.0    0     1 w 0     9 b 1    10 w 1     5 b 0           
001    7 m    Nur ein Test                      1000                             0.0    0     2 b 0     8 w 0  0000 - +    11 b 1           
001    8 mFM  Krstic Petar                      0000 SRB                         0.0    0     3 w 0     7 b 1     9 w 1     1 b =           
001    9 mCM  Sedan Markovic                    0000 SRB                         0.0    0     4 b 0     6 w 0     8 b 0  0000 - +           
001   10 m    Bauer Markus                      0000                             0.0    0     5 w 0  0000 - +     6 b 0     4 w 0           
001   11 m    Schneider Thomas                  0000 GER                         0.0    0  0000 - +     3 b 0     5 w 0     7 w 0           


Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 07.08.2017, 09:50    Titel: Antworten mit Zitat

Man könnte natürlich auch in die Spezifikation schauen, dann muss man nicht raten. zwinkern

Laut Spezifikation stehen zwischen Einträgen nicht einfach "ein oder auch mehrere Leerzeichen" (was auch Unsinn wäre, wenn das Leerzeichen zugleich Bestandteil eines Eintrages sein kann), sondern dein erstes Eintrag
Code:
"   5 y 9"

beginnt exakt an Position 92, das zweite Eintrag an Stelle 102 usw (es kann daher auch sein, dass zwischen zwei Einträgen gar kein Leerzeichen steht - zwar nicht bei den von dir gesuchten Zeichenfolgen, aber z. B. zwischen Geschlecht und Titel).

Mit dieser genauen Zuordnung kannst du dann auch allein an der Zeilenlänge bereits sagen, wie viele Einträge insgesamt drinnen stehen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 07.08.2017, 11:16    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Man könnte natürlich auch in die Spezifikation schauen, dann muss man nicht raten. zwinkern

Laut Spezifikation stehen zwischen Einträgen nicht einfach "ein oder auch mehrere Leerzeichen" (was auch Unsinn wäre, wenn das Leerzeichen zugleich Bestandteil eines Eintrages sein kann), sondern dein erstes Eintrag
Code:
"   5 y 9"

beginnt exakt an Position 92, das zweite Eintrag an Stelle 102 usw (es kann daher auch sein, dass zwischen zwei Einträgen gar kein Leerzeichen steht - zwar nicht bei den von dir gesuchten Zeichenfolgen, aber z. B. zwischen Geschlecht und Titel).

Mit dieser genauen Zuordnung kannst du dann auch allein an der Zeilenlänge bereits sagen, wie viele Einträge insgesamt drinnen stehen.
Also praktisch die Anzahl der ausgelosten Runden? Denn die brauche ich ja! Könnte klappen? Sobald ich etwas mehr Zeit habe, nehme ich das mal in Angriff!

Vielen herzlichen Dank für die Hilfe!
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 07.08.2017, 11:55    Titel: Antworten mit Zitat

Was dir nemored damit sagen will ist, daß sich der eingelesene String aufgrund der exakt vorgegebenen Feldgrößen punktgenau zerlegen lässt. Und auch die Information über die Anzahl der Runden steckt dort schon drin:
Code:
Dim As String DataIdentificationnumber, StartingrankNumber, Sex, Title, PlayerName, Rating, _
              Federation, Number, Birth_Date, Points, Rank
ReDim As String round(0)
Dim As Integer rounds, x

Dim As String TRFdata = "001    5 m    Mustermann Max                    1610 GER  1290111111 04.02.1953  0.0    0    10 b 1     2 w 0    11 b 1     6 w 1"
           
DataIdentificationnumber = Mid(TRFdata, 1, 3)
If DataIdentificationnumber = "001" Then
   StartingrankNumber = Mid(TRFdata, 5, 4)
   '                                 |  |_____Feldgröße
   '                                 |________Feldbeginn
                  Sex = Mid(TRFdata, 10, 1)
                Title = Mid(TRFdata, 11, 3)
           PlayerName = Mid(TRFdata, 15, 33)
               Rating = Mid(TRFdata, 49, 4)
           Federation = Mid(TRFdata, 54, 3)
               Number = Mid(TRFdata, 58, 11)
           Birth_Date = Mid(TRFdata, 70, 10)
               Points = Mid(TRFdata, 81, 4)
                 Rank = Mid(TRFdata, 86, 4)
   rounds = ((Len(TRFdata) - 91) / 10)
   ReDim round(rounds)
   For x = 1 To rounds
      round(x) = Mid(TRFdata, x * 10 + 82, 8)
   Next
EndIf

?   "DataIdentificationnumber "; DataIdentificationnumber
?   "      StartingrankNumber "; StartingrankNumber
?   "                     Sex "; Sex
?   "                   Title "; Title
?   "              PlayerName ";PlayerName
?   "                  Rating ";Rating
?   "              Federation ";Federation
?   "                  Number ";Number
?   "              Birth_Date ";Birth_Date
?   "                  Points ";Points
?   "                    Rank ";Rank
For x = 1 To UBound(round)
   ? "                round ";x;" ";round(x)
Next

Sleep


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 08.08.2017, 17:37    Titel: Antworten mit Zitat

Ich kann es mir nicht verkneifen, eine solche Anwendung schreit geradezu nach einem UDT, und zwar zum Lesen und Erstellen eines Eintrags (@ ALWIM: Nein, wir hören NICHT auf, dich zu bearbeiten, schau mal, wie schön einfach die Handhabung damit wird! lächeln ). Die Properties (das sind Prozeduren innerhalb des UDT, die im Programm aber wie Variablen angesprochen werden) lesen die Daten direkt aus dem String, ohne eigene Variablen zu belegen. Umgekehrt können Werte (neue oder geänderte) direkt in den String geschrieben werden, sie werden automatisch an der richtigen Stelle eingefügt.
Code:
#Macro declareTRFproperty(pname)
   Declare Property pname As String 'zum lesen
   Declare Property pname(v As String) 'zum schreiben
#EndMacro

'(fast) alle properties haben die gleiche struktur, daher zur vereinfachung eine vordefinition als macro
#Macro TRFproperty(prname, start, fieldlen, bnd)
'                            |       |_____Feldgröße
'                            |_____________Feldbeginn
   Property tTRF.prname As String
      Return Mid(TRFdata, start, fieldlen)
   End Property
   Property tTRF.prname(v As String)
      #If bnd = "r"
         Mid(TRFdata, start, fieldlen) = Right(String(fieldlen, " ") + v, fieldlen) 'rechtsbündig
      #ElseIf bnd = "l"
         Mid(TRFdata, start, fieldlen) = Left(v + String(fieldlen, " "), fieldlen) 'linksbündig
      #EndIf
   End Property
#EndMacro

Type tTRF
   As String TRFdata = String(91," ")
   declareTRFproperty(DataIdentificationnumber)
   declareTRFproperty(StartingrankNumber)
   declareTRFproperty(Sex)
   declareTRFproperty(Title)
   declareTRFproperty(PlayerName)
   declareTRFproperty(Rating)
   declareTRFproperty(Federation)
   declareTRFproperty(Number)
   declareTRFproperty(Birth_Date)
   declareTRFproperty(Points)
   declareTRFproperty(Rank)
   Declare Property rounds As Integer
   Declare Property round(r As Integer) As String
   Declare Property round(v As String)
End Type

TRFproperty(DataIdentificationnumber, 1, 3, "r")
TRFproperty(StartingrankNumber, 5, 4, "r")
TRFproperty(Sex, 10, 1, "r")
TRFproperty(Title, 11, 3, "r")
TRFproperty(PlayerName, 15, 33, "l")
TRFproperty(Rating, 49, 4, "r")
TRFproperty(Federation, 54, 3, "r")
TRFproperty(Number, 58, 11, "r")
TRFproperty(Birth_Date, 70, 10, "r")
TRFproperty(Points, 81, 4, "r")
TRFproperty(Rank, 86, 4, "r")

Property tTRF.rounds As Integer 'anzahl der runden ermitteln
   Return (Len(TRFdata) - 91) / 10
End Property

Property tTRF.round(r As Integer) As String 'daten der runde r zurückgeben
   If r <= rounds Then
      Return Mid(TRFdata, r * 10 + 82, 8)
   Else
      Return ""
   EndIf
End Property

Property tTRF.round(r As String) 'neue runde an den string anhängen
   TRFdata += Right(String(10, " ") + r, 10)
End Property

'=== ENDE DER TYPENDEKLARATION ===

' ANWENDUNGSBEISPIELE

Dim As tTRF trf, trf2 'kann auch als array dimensioniert werden

With trf 'bestehenden eintrag auslesen
   .TRFdata = "001    5 m    Mustermann Max                    1610 GER  1290111111 04.02.1953  0.0    0    10 b 1     2 w 0    11 b 1     6 w 1"
   
   ?   "DataIdentificationnumber ";.DataIdentificationnumber
   ?   "      StartingrankNumber ";.StartingrankNumber
   ?   "                     Sex ";.Sex
   ?   "                   Title ";.Title
   ?   "              PlayerName ";.PlayerName
   ?   "                  Rating ";.Rating
   ?   "              Federation ";.Federation
   ?   "                  Number ";.Number
   ?   "              Birth_Date ";.Birth_Date
   ?   "                  Points ";.Points
   ?   "                    Rank ";.Rank
   For x As Integer = 1 To .rounds
      ? "                round ";x;" ";.round(x)
   Next
End With

?

With trf2 'neuen eintrag anlegen
   .DataIdentificationnumber = "001"
         .StartingrankNumber = "5"
                        .Sex = "m"
                      .Title = "GM"
                 .PlayerName = "Zufall Reiner"
                     .Rating = "1234"
                 .Federation = "GER"
                     .Number = "56789"
                 .Birth_Date = "08.08.2012"
                     .Points = "0.0"
                      .round = "0000 - +"
                      .round = "7 b 1"
                      .round = "10 w 1"
                      .round = "1 b ="
   
   'kontrollausdruck
   ?   "DataIdentificationnumber ";.DataIdentificationnumber
   ?   "      StartingrankNumber ";.StartingrankNumber
   ?   "                     Sex ";.Sex
   ?   "                   Title ";.Title
   ?   "              PlayerName ";.PlayerName
   ?   "                  Rating ";.Rating
   ?   "              Federation ";.Federation
   ?   "                  Number ";.Number
   ?   "              Birth_Date ";.Birth_Date
   ?   "                  Points ";.Points
   ?   "                    Rank ";.Rank
   For x As Integer = 1 To .rounds
      ? "                round ";x;" ";.round(x)
   Next
   ?
   ? .TRFdata 'dieser string kann direkt in eine TRF-datei geschrieben werden
End With

Sleep


Der UDT kann jetzt so erweitert werden, daß er die verschiedenen Einträge anhand der DataIdentificationnumber automatisch erkennt und entsprechend verwaltet. Und (@ ALWIM) wenn du später in einem anderen Programm einmal ein TRF - Verwaltungsprogramm benötigst, brauchst du dann nur die Typendeklaration dort hineinzukopieren und fertig - ohne eine einzige Zeile neu zu schreiben.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 08.08.2017, 22:22    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Ich kann es mir nicht verkneifen, eine solche Anwendung schreit geradezu nach einem UDT, und zwar zum Lesen und Erstellen eines Eintrags (@ ALWIM: Nein, wir hören NICHT auf, dich zu bearbeiten, schau mal, wie schön einfach die Handhabung damit wird! lächeln ). Die Properties (das sind Prozeduren innerhalb des UDT, die im Programm aber wie Variablen angesprochen werden) lesen die Daten direkt aus dem String, ohne eigene Variablen zu belegen. Umgekehrt können Werte (neue oder geänderte) direkt in den String geschrieben werden, sie werden automatisch an der richtigen Stelle eingefügt.
Code:
#Macro declareTRFproperty(pname)
   Declare Property pname As String 'zum lesen
   Declare Property pname(v As String) 'zum schreiben
#EndMacro

'(fast) alle properties haben die gleiche struktur, daher zur vereinfachung eine vordefinition als macro
#Macro TRFproperty(prname, start, fieldlen, bnd)
'                            |       |_____Feldgröße
'                            |_____________Feldbeginn
   Property tTRF.prname As String
      Return Mid(TRFdata, start, fieldlen)
   End Property
   Property tTRF.prname(v As String)
      #If bnd = "r"
         Mid(TRFdata, start, fieldlen) = Right(String(fieldlen, " ") + v, fieldlen) 'rechtsbündig
      #ElseIf bnd = "l"
         Mid(TRFdata, start, fieldlen) = Left(v + String(fieldlen, " "), fieldlen) 'linksbündig
      #EndIf
   End Property
#EndMacro

Type tTRF
   As String TRFdata = String(91," ")
   declareTRFproperty(DataIdentificationnumber)
   declareTRFproperty(StartingrankNumber)
   declareTRFproperty(Sex)
   declareTRFproperty(Title)
   declareTRFproperty(PlayerName)
   declareTRFproperty(Rating)
   declareTRFproperty(Federation)
   declareTRFproperty(Number)
   declareTRFproperty(Birth_Date)
   declareTRFproperty(Points)
   declareTRFproperty(Rank)
   Declare Property rounds As Integer
   Declare Property round(r As Integer) As String
   Declare Property round(v As String)
End Type

TRFproperty(DataIdentificationnumber, 1, 3, "r")
TRFproperty(StartingrankNumber, 5, 4, "r")
TRFproperty(Sex, 10, 1, "r")
TRFproperty(Title, 11, 3, "r")
TRFproperty(PlayerName, 15, 33, "l")
TRFproperty(Rating, 49, 4, "r")
TRFproperty(Federation, 54, 3, "r")
TRFproperty(Number, 58, 11, "r")
TRFproperty(Birth_Date, 70, 10, "r")
TRFproperty(Points, 81, 4, "r")
TRFproperty(Rank, 86, 4, "r")

Property tTRF.rounds As Integer 'anzahl der runden ermitteln
   Return (Len(TRFdata) - 91) / 10
End Property

Property tTRF.round(r As Integer) As String 'daten der runde r zurückgeben
   If r <= rounds Then
      Return Mid(TRFdata, r * 10 + 82, 8)
   Else
      Return ""
   EndIf
End Property

Property tTRF.round(r As String) 'neue runde an den string anhängen
   TRFdata += Right(String(10, " ") + r, 10)
End Property

'=== ENDE DER TYPENDEKLARATION ===

' ANWENDUNGSBEISPIELE

Dim As tTRF trf, trf2 'kann auch als array dimensioniert werden

With trf 'bestehenden eintrag auslesen
   .TRFdata = "001    5 m    Mustermann Max                    1610 GER  1290111111 04.02.1953  0.0    0    10 b 1     2 w 0    11 b 1     6 w 1"
   
   ?   "DataIdentificationnumber ";.DataIdentificationnumber
   ?   "      StartingrankNumber ";.StartingrankNumber
   ?   "                     Sex ";.Sex
   ?   "                   Title ";.Title
   ?   "              PlayerName ";.PlayerName
   ?   "                  Rating ";.Rating
   ?   "              Federation ";.Federation
   ?   "                  Number ";.Number
   ?   "              Birth_Date ";.Birth_Date
   ?   "                  Points ";.Points
   ?   "                    Rank ";.Rank
   For x As Integer = 1 To .rounds
      ? "                round ";x;" ";.round(x)
   Next
End With

?

With trf2 'neuen eintrag anlegen
   .DataIdentificationnumber = "001"
         .StartingrankNumber = "5"
                        .Sex = "m"
                      .Title = "GM"
                 .PlayerName = "Zufall Reiner"
                     .Rating = "1234"
                 .Federation = "GER"
                     .Number = "56789"
                 .Birth_Date = "08.08.2012"
                     .Points = "0.0"
                      .round = "0000 - +"
                      .round = "7 b 1"
                      .round = "10 w 1"
                      .round = "1 b ="
   
   'kontrollausdruck
   ?   "DataIdentificationnumber ";.DataIdentificationnumber
   ?   "      StartingrankNumber ";.StartingrankNumber
   ?   "                     Sex ";.Sex
   ?   "                   Title ";.Title
   ?   "              PlayerName ";.PlayerName
   ?   "                  Rating ";.Rating
   ?   "              Federation ";.Federation
   ?   "                  Number ";.Number
   ?   "              Birth_Date ";.Birth_Date
   ?   "                  Points ";.Points
   ?   "                    Rank ";.Rank
   For x As Integer = 1 To .rounds
      ? "                round ";x;" ";.round(x)
   Next
   ?
   ? .TRFdata 'dieser string kann direkt in eine TRF-datei geschrieben werden
End With

Sleep


Der UDT kann jetzt so erweitert werden, daß er die verschiedenen Einträge anhand der DataIdentificationnumber automatisch erkennt und entsprechend verwaltet. Und (@ ALWIM) wenn du später in einem anderen Programm einmal ein TRF - Verwaltungsprogramm benötigst, brauchst du dann nur die Typendeklaration dort hineinzukopieren und fertig - ohne eine einzige Zeile neu zu schreiben.

Gruß
grindstone
Ich bin erstaunt, was ihr alles zusammenbringt! Daumen rauf!
Zitat:
(@ ALWIM: Nein, wir hören NICHT auf, dich zu bearbeiten, schau mal, wie schön einfach die Handhabung damit wird! ).
Netter Versuch, aber ich bin bereits dran! Mit UDT zu programmieren, ist nicht mein Stil. zwinkern
Ich habe jetzt, zumindest einen Lösungsansatz. Das was ihr mir da gepostet habt, kann ich sowieso nicht gebrauchen! Würde aber theoretisch funktionieren, wenn ich das restliche noch mit rein programmiere und ein wenig umändere.

Zitat:
Was dir nemored damit sagen will ist, daß sich der eingelesene String aufgrund der exakt vorgegebenen Feldgrößen punktgenau zerlegen lässt.
Ist natürlich klar, dass ich das auswerten kann, wenn die Werte exakt an bestimmten Positionen liegen. Daran habe ich zunächst nicht gedacht...
Mein Plan ist ja, dass ich das Programm bei der FIDE offiziell zur Anerkennung einreiche! Das geht nämlich. Ich muss nur bestimmte Dinge drin haben! Und dazu, zählt halt auch das laden einer TRF/FID-Datei!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 08.08.2017, 23:25    Titel: Antworten mit Zitat

Wenn du grindstones UDT-Vorschlag hernimmst (den kannst du auch in eine extra Datei auslagern und mit #INCLUDE einbinden -dann bekommst du das "komplizierte UDT-Gedöns" nie mehr zu Gesicht), dann geht das Laden aus einer TRF-Datei sehr einfach:

Code:
DIM AS tTRF eintrag
' ...
' Datei öffnen usw.
'...
' Datenzeile einlesen und enthaltenen Spielernamen ausgeben
LINE INPUT #dateinummer, eintrag.TRFdata
PRINT TRIM(eintrag.PlayerName); " hat"; eintrag.rounds; " Runden gespielt."

Ist auch nicht komplizierter als das Verwenden von normalen Variablen; kommt halt im Namen ein Punkt mit vor. Allerdings musst du überhaupt gar nichts mehr extrahieren, denn das wird schon für dich erledigt. (Ob es sich um Spielerdaten handelt, sprich: ob der Eintrag mit "001" beginnt, musst du allerdings prüfen.)

@grindstone: schönes und umfassendes Beispiel; aber um bei jemandem, der noch nicht mit UDTs gearbeitet hat, für UDTs zu werben, ist es viel zu kompliziert. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 09.08.2017, 21:38    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
...um bei jemandem, der noch nicht mit UDTs gearbeitet hat, für UDTs zu werben, ist es viel zu kompliziert. happy
Soll ja auch nur zeigen, was damit alles möglich ist. Im Moment geht es ALWIM ja scheinbar sowieso nur ums Auslesen, und auch nur deshalb, weil es im Anforderungskatalog steht.

ALWIM hat Folgendes geschrieben:
Mein Plan ist ja, dass ich das Programm bei der FIDE offiziell zur Anerkennung einreiche!
Auf jeden Fall wünsche ich dir viel Erfolg! lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 09.08.2017, 22:11    Titel: Antworten mit Zitat

grindstone hat Folgendes geschrieben:
nemored hat Folgendes geschrieben:
...um bei jemandem, der noch nicht mit UDTs gearbeitet hat, für UDTs zu werben, ist es viel zu kompliziert. happy
Soll ja auch nur zeigen, was damit alles möglich ist. Im Moment geht es ALWIM ja scheinbar sowieso nur ums Auslesen, und auch nur deshalb, weil es im Anforderungskatalog steht.

ALWIM hat Folgendes geschrieben:
Mein Plan ist ja, dass ich das Programm bei der FIDE offiziell zur Anerkennung einreiche!
Auf jeden Fall wünsche ich dir viel Erfolg! lächeln

Gruß
grindstone
Nicht nur ums auslesen, auch ums schreiben! Aber das habe ich ja bereits programmiert. Im Anforderungskatalog, stehen so einige Sachen drin. Schon erstaunlich was die alles verlangen! Bis auf das Einlesen der TRF-Datei habe ich bereits alles drin.

Zitat:
ALWIM hat Folgendes geschrieben:
Mein Plan ist ja, dass ich das Programm bei der FIDE offiziell zur Anerkennung einreiche!
Auf jeden Fall wünsche ich dir viel Erfolg! lächeln
Eventuell reiche ich es ein! Aber geplant ist es zunächst ein mal. Ich bin schon extrem weit gekommen! Die Spieler werden schon mal per TRF eingelesen! Jetzt fehlen nur noch die Paarungen mit den Ergebnissen.

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz