|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 06.08.2017, 19:49 Titel: Loadbefehl - Laden von Werten aus Datei |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 06.08.2017, 22:04 Titel: |
|
|
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 . _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 06.08.2017, 22:47 Titel: |
|
|
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... 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, 22:58, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 06.08.2017, 22:55 Titel: |
|
|
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 |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 06.08.2017, 23:02 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 06.08.2017, 23:07 Titel: |
|
|
Und woher weißt du, dass der erste Abschnitt "5 y 9" ist und nicht z. B.
oder gar
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 |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 06.08.2017, 23:12 Titel: |
|
|
nemored hat Folgendes geschrieben: | Und woher weißt du, dass der erste Abschnitt ist und nicht z. B.
oder gar
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 06.08.2017, 23:18 Titel: |
|
|
Na, dann passt es doch. 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 |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 06.08.2017, 23:36 Titel: |
|
|
nemored hat Folgendes geschrieben: | Na, dann passt es doch. 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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 07.08.2017, 10:50 Titel: |
|
|
Man könnte natürlich auch in die Spezifikation schauen, dann muss man nicht raten.
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
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 |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 07.08.2017, 12:16 Titel: |
|
|
nemored hat Folgendes geschrieben: | Man könnte natürlich auch in die Spezifikation schauen, dann muss man nicht raten.
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
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 07.08.2017, 12:55 Titel: |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 08.08.2017, 18:37 Titel: |
|
|
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! ). 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 |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 08.08.2017, 23:22 Titel: |
|
|
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! ). 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!
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.
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 09.08.2017, 00:25 Titel: |
|
|
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. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 09.08.2017, 22:38 Titel: |
|
|
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!
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1037 Wohnort: Niederbayern
|
Verfasst am: 09.08.2017, 23:11 Titel: |
|
|
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!
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! | 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 |
|
|
|
|
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.
|
|