Array aus Datei einlesen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

pile

Betreff: Array aus Datei einlesen

BeitragFr, Aug 17, 2018 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich habe nach laaanger Zeit mal wieder mit Blitz angefangen und mich nun etwas in BlitzMax eingearbeitet.
Ich haben nun folgendes Problem: Ich muss eine Datenbank in mein Programm einlesen. Diese will ich aber in einer Datei auslagern. Es handelt sich um Strings, und was Strings angeht, bin ich hier auf Multi-Dimensional Auto Arrays gestoßen.
Das sieht halt so aus:
Code: [AUSKLAPPEN]
Local string_array:String[][] = [["Bob","Kate","Percy"],["Cecil","Edmund","Elizabeth"]]

Print string_array[0][2] 'this will print Percy


Nun möchte ich in meiner Datei für jede Klammer eine Zeile nutzen. Wenn also in der ersten Zeile
Code: [AUSKLAPPEN]
Bob,Kate,Percy
und in der zweiten Zeile
Code: [AUSKLAPPEN]
Cecil,Edmund,Elizabeth
in der Datei steht, wie lese ich das dann korrekt ins Array ein?
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Xeres

Moderator

BeitragFr, Aug 17, 2018 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Strings haben eine split methode, damit kann man eine eingelesene Zeile am Komma aufteilen. Falls das Trennzeichen im Text vorkommen könne soll, muss man was komplizierteres selber basteln.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragSa, Aug 18, 2018 9:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal ein Beispielcode:

BlitzMax: [AUSKLAPPEN]
SuperStrict
Graphics 800,600
Global tempText:String
Global CrLF$="~n"


Global DateiName:String="DatenBank.csv"
If FileType(DateiName)
tempText=LoadText(DateiName)
Else
tempText="Bob,Kate,Percy" + CrLf + "Cecil,Edmund,Elizabeth"
EndIf

Global tempZeile:String[]=tempText.Split(CrLF)

Global Array:String[99,3]
For Local i:Int=0 To tempZeile.Length-1
Local tempElement:String[]=tempZeile[i].Split(",")
Print "Z=" + tempZeile[i]
For Local j:Int=0 To tempElement.Length-1
Print " E=" + tempElement[j]
Array[i,j]=tempElement[j]
Next
Next

pile

BeitragSa, Aug 18, 2018 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Antworten sehr hilfreich.
Gibt es eigentlich eine Suchfunktion für Arrays die mir die Position des Suchbegriffs im Array ausgibt?

Da ich mir vorstellen kann, dass es keine Funktion geben wird, hab ich dazu das Wort "Suchbegriff" als erste Zeile in die Datei eingefügt mir jetzt mal schnell eine Schleife dafür zusammengebastelt:
Code: [AUSKLAPPEN]
Print CrLF$ +  "------------------------" + CrLF$ + "Suchbegriff wird gesucht:"
   For Local i:Int=0 To tempZeile.Length-1
      If tempZeile[i] = "Suchbegriff"
         Print "Suchbegriff wurde in Zeile " + i + " gefunden."
      Else
         Print "Suchbegriff wurde nicht gefunden"
      EndIf
   Next
   Print "Ende der Suche"

Leider konnte so nix gefunden werden, obwohl das Wort eindeutig als Zeile in der Datei steht.
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Midimaster

BeitragSo, Aug 19, 2018 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Code funktioniert bei mir. Allerdings schreibt er noch 2x ""Suchbegriff wurde nicht gefunden" für die anderen beiden Zeilen darunter. Besser wäre es nach einem Treffer die Suche abzubrechen:

BlitzMax: [AUSKLAPPEN]
....

Local Erfolg:Int = -1
Print CrLF$ + "------------------------" + CrLF$ + "Suchbegriff wird gesucht:"
For Local i:Int=0 To tempZeile.Length-1
If tempZeile[i] = "Suchbegriff"
Erfolg=i
Exit
EndIf
Next
Print

If Erfolg>-1
Print "Suchbegriff wurde in Zeile " + Erfolg + " gefunden."
Else
Print "Suchbegriff wurde nicht gefunden"
EndIf
Print "Ende der Suche"


Und Dein Code funktioniert nur, wenn der Suchbegriff als einziges Wort in der Zeile steht. Wenn Du z.b. nach "Edmund" suchen willst, ist INSTR() die richtige Funktion:

BlitzMax: [AUSKLAPPEN]
....
Local Erfolg:Int = -1
Print CrLF$ + "------------------------" + CrLF$ + "Suchbegriff wird gesucht:"
For Local i:Int=0 To tempZeile.Length-1
If Instr(tempZeile[i], "Edmund")
Erfolg=i
Exit
EndIf
Next
....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

pile

BeitragDi, Aug 21, 2018 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
bei mir funktioniert es weiterhin nicht. Ich poste mal den kompletten Code, wahrscheinlich ergibt sich dadurch der Fehler:

BlitzMax: [AUSKLAPPEN]
SuperStrict
SeedRnd MilliSecs()

'Globale Programmeinstellungen
AppTitle = "Datenbank"
Global ResX:Int = 800
Global ResY:Int = 600
Graphics ResX, ResY


'Variablen


'Datenbank
Global tempText:String
Global CrLF$="~n"
Global Datenbankdatei:String="datenbank.txt"

If FileType(Datenbankdatei)
tempText=LoadText(Datenbankdatei)
Else
RuntimeError "Datenbankdatei konnte nicht gefunden werden"
EndIf

Print
Print "Komplette Datei: " + CrLF$ + "------------------------" + CrLF$ + tempText + CrLF$ + "------------------------"

Global tempZeile:String[]=tempText.Split(CrLF)
Local Erfolg:Int = -1
Print CrLF$ + "------------------------" + CrLF$ + "Suchbegriff wird gesucht:"
For Local i:Int=0 To tempZeile.Length-1
If tempZeile[i] = "Suchbegriff"
Erfolg=i
Exit
EndIf
Next
Print

If Erfolg>-1
Print "Suchbegriff wurde in Zeile " + Erfolg + " gefunden."
Else
Print "Suchbegriff wurde nicht gefunden"
EndIf
Print "Ende der Suche"


Und der Inhalt von "Datenbank.txt" ist halt folgendender:
Code: [AUSKLAPPEN]

Bob,Kate,Percy
Suchbegriff
Cecil,Edmund,Elizabeth
Test1
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Midimaster

BeitragDi, Aug 21, 2018 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Zeilumbruch besteht in einer "*.txt"-Datei nicht aus dem einen Zeichen "~n" sondern aus zwei Zeichen "~r~n"

Also musst Du im Code noch ändern:

BlitzMax: [AUSKLAPPEN]
...
'Datenbank
Global tempText:String

Global CrLF$="~r~n" '<---hier

Global Datenbankdatei:String="datenbank.txt"
...

Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

pile

BeitragDi, Aug 21, 2018 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank, darauf wäre ich ja nie gekommen. Gibt es nochmehr solcher Unterschiede zwischen den Dateitypen? Gibts da ne Liste für oder etwas anderes um sich einzulesen?

BlitzMax: [AUSKLAPPEN]

Global CrLF$
If Instr(Datenbankdatei, ".txt")
CrLF$="~r~n"
Else
CrLF$="~n"
EndIf



Achja wo es mir gerade auffällt. Die Variable CrLF$ hat ja das $-Zeichen. Heißt das, damit ist sie dann automatisch als String deklariert?
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

DC

Sieger des B2D Retro Wettbewerb / Aug 04

BeitragDi, Aug 21, 2018 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem ~n und ~r~n hängt eher vom Betriebssystem und/oder verwendetem Programm ab als vom Dateityp.
~n ist typisch für Unix-basierte Systeme (z.B. Linux, MacOS), ~r~n ist typisch für Windows.

Eine .txt hat also höchstwahrscheinlich nur ~n für Umbrüche wenn sie unter Linux erzeugt wurde, unter Windows vermutlich aber ~r~n. In den meisten Programmen kann man die Umbrüche aber auch einstellen.

Man sollte also immer mit beiden Varianten rechnen und umgehen können und es eben nicht von der Dateiendung abhängig machen.
https://de.wikipedia.org/wiki/Zeilenumbruch

Eine Lösung ist z.B. das ~n als Trennzeichen zu nehmen und zusätzliche ~r am Anfang/Ende der Zeile wegzuwerfen.
Core i5 4670K | 4 x 3,40 GHZ | 16 GB Ram | GeForce GTX 960 | HTC Vive | Win 10 Pro
www.UnrealSoftware.de | www.StrandedOnline.de | www.CS2D.com |
www.CarnageContest.com | www.Stranded3.com

Xeres

Moderator

BeitragDi, Aug 21, 2018 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hat nichts mit Dateitypen zu tun. Das sind Betriebssystemspezifika, die historisch so gewachsen sind. Pfade in Unix werden mit / getrennt, in Windows mit \ - muss man halt dran denken.

Der Lesbarkeit wegen, würde ich Variablen/Typen immer in Langform Deklarieren (also "var:string"). Die Symbole gibt's noch weil sie in BlitzBasic drinne waren.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

DAK

BeitragDo, Aug 23, 2018 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Datenstrukturen in Files schreiben ist nicht immer ganz trivial, besonders wenn man beliebige Werte reinschreiben können will.

Eine gute (und weit verbreitete) Variante dazu ist JSON. In JSON kann man beliebige Strings, Integers, Arrays und Maps (die beinhalten Schlüssel-Wert-Paare) reinschreiben.

Ich hab per Google zwei Varianten davon gefunden, die beide OK funktionieren sollten:

https://github.com/mahan/bmx-json
https://github.com/Trylobot/bmx-rjson


Das Zweite sollte etwas besser sein.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group