Split-Funktion
Split-Funktion
Hallo Liebe Gambas-Gemeinde,
ich komme mit der Split-Funktion in Gambas nicht klar.
Habe auch nach viel Sucherei keine für mich brauchbare Lösung gefunden.
Ich habe beispielsweise folgenden String: "08.08.24|Einkauf|23,56".
In VB.net ist die Aufgabe leicht zu lösen:
Dim st() As String = "08.08.24|Einkauf|23,56".Split("|")
TextLabel1.Text = st(2) >Teilstrings werden durchnummeriert st(0), st(1), st(2)
Im TextLabe1 steht dann 23,56.
Die eigentliche Aufgabe ist es, aus einer TextArea mit n Zeilen alle letzten Substrings zu addieren über
einen Schleifendurchlauf, also:
06.08.24|Einkauf|12,09
07.08.24|Einkauf| 5,00
08.08.24|Einkauf|23,56
u.s.w.
Die Summe (hier 40,65) wird dann in einem Label ausgegeben.
Alternativ wäre es mir auch recht, da die Daten in einem GridViev ausgegeben werden, die Summe aller Rows in Column 3 zu erhalten.
Ich hoffe mein Problem verständlich dargestellt zu haben und benötige Hilfe, evtl. mit einem kleinen Snippet.
Ich freue mich auf Eure Hilfe und sage Danke
IngaD
ich komme mit der Split-Funktion in Gambas nicht klar.
Habe auch nach viel Sucherei keine für mich brauchbare Lösung gefunden.
Ich habe beispielsweise folgenden String: "08.08.24|Einkauf|23,56".
In VB.net ist die Aufgabe leicht zu lösen:
Dim st() As String = "08.08.24|Einkauf|23,56".Split("|")
TextLabel1.Text = st(2) >Teilstrings werden durchnummeriert st(0), st(1), st(2)
Im TextLabe1 steht dann 23,56.
Die eigentliche Aufgabe ist es, aus einer TextArea mit n Zeilen alle letzten Substrings zu addieren über
einen Schleifendurchlauf, also:
06.08.24|Einkauf|12,09
07.08.24|Einkauf| 5,00
08.08.24|Einkauf|23,56
u.s.w.
Die Summe (hier 40,65) wird dann in einem Label ausgegeben.
Alternativ wäre es mir auch recht, da die Daten in einem GridViev ausgegeben werden, die Summe aller Rows in Column 3 zu erhalten.
Ich hoffe mein Problem verständlich dargestellt zu haben und benötige Hilfe, evtl. mit einem kleinen Snippet.
Ich freue mich auf Eure Hilfe und sage Danke
IngaD
Re: Split-Funktion
Inga,
Das Splitten läuft genauso ab wie Du es beschrieben hast.
ich kenne Visual Basic nicht, deshalb kann ich das jetzt nicht vergleichen, aber es sieht in Gambas ziemlich ähnlich aus.
In Gambas: siehe https://gambaswiki.org/wiki/lang/split
also Du schreibst für Visual Basic:
du schreibst diese in Split()
---> in Visual Basic schreibst Du hingegen Split am Ende des Strings als Methode wie bei Python.
Hier ist es also so, dass Du in Gambas vorher eine Array dimensionierst, welches das Ergebnis der Funktion aufnimmt.
In Gambas gibt es zwei Arten von Arrays dynamische, deren Größe veränderbar ist und statische, wo die
Größe bei der Deklaration festgelegt wird und dann nicht mehr verändert werden kann.
In der Regel solltest Du nur dynamische Arrays verwenden.
Du erstellst es wie folgt:
Dim arString As String[] --> entscheidend ist hier String[ ], es ist also ein Array aus Zeichenketten.
Wenn Du diesem String etwas zufügen möchtest, dann müsstest Du vorher erst ein array-Objekt erstellen,
sonst würdest Du ein Fehler erhalten.
arString.Add("Toll") ---> das wäre ein Fehler, Nullobjekt, denn Du hast noch kein Objekt erstellt.
deshalb, erstellst Du jetzt erst einmal mit dem New-Operator ein Objekt.
arString = New String[]
diesem Array-Objekt kannst Du jetzt weitere Elemente zufügen.
arString.Add("Toll") --> jetzt gibt es keinen Fehler
etwas anders wäre es, wenn Du bei der Deklaration bereits die Initialisierung vornimmst.
also z.B.
Dim arString As String[] = ["eins", "zwei", "drei"]
Jetzt hast Du ein Array mit drei Elementen, wobei der Index bei 0 beginnt.
Diesem Array, weil es ja dynamisch ist, kannst Du jetzt auch weitere Elemente hinzufügen.
Also z.B. arString.Add("Toll") ---> jetzt gibt es wiederum keinen Fehler.
Wie ist es jetzt beim Splitte?
arString = Split("Das ist ein Test", " ")
--> das ist ja das gleiche wie die Initialisierung: String[] = ["eins", "zwei", "drei"]
--> nur eben hier mit den Elementen dieser Split-Anweisung:
arString[ ] = ["Das", "ist", "ein", "Test" ] --> ein Array mit 4 Elementen
auch hiernach kannst Du diesem Array weitere Elemente hinzufügen.
arString = Split("Das ist ein Test", " ")
Das hatte jetzt vielleicht weniger mit dem Splitten zu tun, aber da Du durch das Splitten ein Array erhältst, wollte ich das noch mal ausführlich darstellen.
Das Splitten
Neben dem "Separator" hast Du bei der Funktion Split noch weitere Parameter die aber alle optional sind und deshalb erspare ich es Dir hier jetzt diese zu erklären.
Wie ich Dir letztes mal gezeigt habe, kannst Du auf diese Weise jede Zeile einer Datei, welche Du einliest splitten.
sTempListe = Split(hFile.ReadLine(), " ")
--> hFile.ReadLine() steht hier als für eine Zeile der Datei, welche in einem String gelesen wird.
--> ich habe es ja mit eine temporären Liste gemacht, welche Du natürlich auch weglassen kannst und stattdessen die einzelnen
Elemente des Splits direkt aufrufst als z.B. Split(hFile.ReadLine(), " ")[1]
--> aber ich bleibe lieber bei der Liste.
---> da Du nicht weißt wie viele einzelne Elemente eine Zeile hat
müsstest Du hier mit
sTempListe.Last arbeiten. .Last gibt Dir das letzte Element eines Arrays wieder.
schaue Dir mal die Methoden der Arrays an, ich weiß nicht, welche da VSB lieferte:
https://gambaswiki.org/wiki/comp/gb/string[]
So, die Antwort war etwas umfangreicher.
Entschuldige bitte, wenn das meiste für Dich ein alter Hut ist. Ich habe aber Null Erfahrung mit Visual Basic und habe so
erklärt wie ich es aktuell durch das eigenes Studium verstanden habe.
Das Splitten läuft genauso ab wie Du es beschrieben hast.
ich kenne Visual Basic nicht, deshalb kann ich das jetzt nicht vergleichen, aber es sieht in Gambas ziemlich ähnlich aus.
In Gambas: siehe https://gambaswiki.org/wiki/lang/split
Code: Alles auswählen
StringArray = Split ( String [ , Separators , Escape , IgnoreVoid , KeepEscape ] )
--> In Gambas ist es also ein Funktion, welcher Du den String und den Seperator als Parameter gibst.Dim st() As String = "08.08.24|Einkauf|23,56".Split("|")
du schreibst diese in Split()
---> in Visual Basic schreibst Du hingegen Split am Ende des Strings als Methode wie bei Python.
Hier ist es also so, dass Du in Gambas vorher eine Array dimensionierst, welches das Ergebnis der Funktion aufnimmt.
In Gambas gibt es zwei Arten von Arrays dynamische, deren Größe veränderbar ist und statische, wo die
Größe bei der Deklaration festgelegt wird und dann nicht mehr verändert werden kann.
In der Regel solltest Du nur dynamische Arrays verwenden.
Du erstellst es wie folgt:
Dim arString As String[] --> entscheidend ist hier String[ ], es ist also ein Array aus Zeichenketten.
Wenn Du diesem String etwas zufügen möchtest, dann müsstest Du vorher erst ein array-Objekt erstellen,
sonst würdest Du ein Fehler erhalten.
arString.Add("Toll") ---> das wäre ein Fehler, Nullobjekt, denn Du hast noch kein Objekt erstellt.
deshalb, erstellst Du jetzt erst einmal mit dem New-Operator ein Objekt.
arString = New String[]
diesem Array-Objekt kannst Du jetzt weitere Elemente zufügen.
arString.Add("Toll") --> jetzt gibt es keinen Fehler
etwas anders wäre es, wenn Du bei der Deklaration bereits die Initialisierung vornimmst.
also z.B.
Dim arString As String[] = ["eins", "zwei", "drei"]
Jetzt hast Du ein Array mit drei Elementen, wobei der Index bei 0 beginnt.
Diesem Array, weil es ja dynamisch ist, kannst Du jetzt auch weitere Elemente hinzufügen.
Also z.B. arString.Add("Toll") ---> jetzt gibt es wiederum keinen Fehler.
Wie ist es jetzt beim Splitte?
arString = Split("Das ist ein Test", " ")
--> das ist ja das gleiche wie die Initialisierung: String[] = ["eins", "zwei", "drei"]
--> nur eben hier mit den Elementen dieser Split-Anweisung:
arString[ ] = ["Das", "ist", "ein", "Test" ] --> ein Array mit 4 Elementen
auch hiernach kannst Du diesem Array weitere Elemente hinzufügen.
arString = Split("Das ist ein Test", " ")
Das hatte jetzt vielleicht weniger mit dem Splitten zu tun, aber da Du durch das Splitten ein Array erhältst, wollte ich das noch mal ausführlich darstellen.
Das Splitten
Neben dem "Separator" hast Du bei der Funktion Split noch weitere Parameter die aber alle optional sind und deshalb erspare ich es Dir hier jetzt diese zu erklären.
Wie ich Dir letztes mal gezeigt habe, kannst Du auf diese Weise jede Zeile einer Datei, welche Du einliest splitten.
sTempListe = Split(hFile.ReadLine(), " ")
--> hFile.ReadLine() steht hier als für eine Zeile der Datei, welche in einem String gelesen wird.
--> ich habe es ja mit eine temporären Liste gemacht, welche Du natürlich auch weglassen kannst und stattdessen die einzelnen
Elemente des Splits direkt aufrufst als z.B. Split(hFile.ReadLine(), " ")[1]
--> aber ich bleibe lieber bei der Liste.
n Zeilen alle letzten Substrings
---> da Du nicht weißt wie viele einzelne Elemente eine Zeile hat
müsstest Du hier mit
sTempListe.Last arbeiten. .Last gibt Dir das letzte Element eines Arrays wieder.
schaue Dir mal die Methoden der Arrays an, ich weiß nicht, welche da VSB lieferte:
https://gambaswiki.org/wiki/comp/gb/string[]
So, die Antwort war etwas umfangreicher.
Entschuldige bitte, wenn das meiste für Dich ein alter Hut ist. Ich habe aber Null Erfahrung mit Visual Basic und habe so
erklärt wie ich es aktuell durch das eigenes Studium verstanden habe.
Ceterum censeo Goo..... esse delendam
-
- Foriker
- Beiträge: 262
- Registriert: Fr 16. Jan 2015, 01:27
- Wohnort: Europäische Union - Italia
- Kontaktdaten:
Re: Split-Funktion
Wenn Sie jedoch die Funktion "Split()" verwenden möchten, könnte dies ein möglicher Code sein:
gambas code
gambas code
Public Sub Main() ' Wir nehmen an, dass die Zeichenkette folgende Textstruktur hat: Dim t As String = "06.08.24|Einkauf|12,09\n" "07.08.24|Einkauf| 5,00\n" "08.08.24|Einkauf|23,56" Dim ss As String[] Dim c As Single ' Die erste Funktion "Split()" identifiziert die drei Unterzeichenketten und unterscheidet sie nach dem Zeichen escape "\n" (&h0A): ss = Split(t, gb.NewLine) ' Für jede Teilzeichenfolge im "ss"-Array... For n As Byte = 0 To ss.Max ' ...der letzte Teil wird ermittelt, welcher sich durch das Zeichen "|" unterscheidet. ' Wird dann von einer numerischen Darstellung des Texttyps in einen numerischen Wert des Typs "Single" umgewandelt und fügen ihn zu den vorherigen hinzu: c += Val(Split(ss[n], "|")[2]) Next Print c, Format(c, "0.00") End
Europaeus sum
Re: Split-Funktion
Hallo Poly
vielen Dank für Deine sehr umfangreiche Hilfestellung.
Eines noch: Ich schreibe/programmiere in dem Sinne nicht für VB.
Bin mal vor neun Jahren aus Verlegenheit auf VB.Net gekommen, aber die "große Programmiererin" bin ich echt nicht; habe einige kleine Apps zum eigenen Vergnügen geschrieben.
Um mein Hirn "locker und beweglich" zu halten versuche ich mich jetzt in Gambas.
Zu MS Windows Zeiten hatte ich mir ein durchaus konfortables Haushaltsbuch geschrieben - mit viel Try and Error übrigens.
Seit etwa 3-4 Monaten bin ich Linux Mint(-erin). Eine Welt, in die sich soror et frater auch erst mal reindenken muss (meine Meinung!).
So ein Haushaltsbuch versuche ich jetzt in Gambas zu realisieren.
Werde Deine Anleitung beachten und "durcharbeiten". Ich denke, dass ich da mehr verstehen werde.
Wirklich vielen Dank Poly und lieber Gruß von
IngaD
vielen Dank für Deine sehr umfangreiche Hilfestellung.
Eines noch: Ich schreibe/programmiere in dem Sinne nicht für VB.
Bin mal vor neun Jahren aus Verlegenheit auf VB.Net gekommen, aber die "große Programmiererin" bin ich echt nicht; habe einige kleine Apps zum eigenen Vergnügen geschrieben.
Um mein Hirn "locker und beweglich" zu halten versuche ich mich jetzt in Gambas.
Zu MS Windows Zeiten hatte ich mir ein durchaus konfortables Haushaltsbuch geschrieben - mit viel Try and Error übrigens.
Seit etwa 3-4 Monaten bin ich Linux Mint(-erin). Eine Welt, in die sich soror et frater auch erst mal reindenken muss (meine Meinung!).
So ein Haushaltsbuch versuche ich jetzt in Gambas zu realisieren.
Werde Deine Anleitung beachten und "durcharbeiten". Ich denke, dass ich da mehr verstehen werde.
Wirklich vielen Dank Poly und lieber Gruß von
IngaD
Re: Split-Funktion
Soror fratrem salutat!
Hallo vuott, wie heißt es doch gleich: "Cogito ergo sum, non cogito ergo dumm."
Ich bekomme Ihr snippet zum splitten und auswerten einer Textdatei nicht umgesetzt.
Wenn ich Ihr script ut est anwende mit einer kleinen Änderung für die Darstellung der Summe in einem TextLabel, dann klapp es.
Aber ich habe die Strings in einer Textdatei - Zeile für Zeile.
Wenn ich die Variable t mit t = File.Load("/home/ingad/Gambas/Split_Test_1/August_2024.txt") angebe, erhalte ich eine Fehlermeldung in der Zeile
c += Val(Split(ss[n], "|")[2])
Typenunverträglichkeit: Erwarte Number, stattdessen Null erhalten
In der Textdatei steht:
06.08.24|Einkauf|12,09
07.08.24|Einkauf| 5,00
08.08.24|Einkauf|23,56
Es gibt bestimmt eine einfache Lösung, auf die ich nicht komme.
Wie sieht die aus? Bitte um Hilfe.
Danke und lieber Gruß von soror IngaD.
Hallo vuott, wie heißt es doch gleich: "Cogito ergo sum, non cogito ergo dumm."
Ich bekomme Ihr snippet zum splitten und auswerten einer Textdatei nicht umgesetzt.
Wenn ich Ihr script ut est anwende mit einer kleinen Änderung für die Darstellung der Summe in einem TextLabel, dann klapp es.
Aber ich habe die Strings in einer Textdatei - Zeile für Zeile.
Wenn ich die Variable t mit t = File.Load("/home/ingad/Gambas/Split_Test_1/August_2024.txt") angebe, erhalte ich eine Fehlermeldung in der Zeile
c += Val(Split(ss[n], "|")[2])
Typenunverträglichkeit: Erwarte Number, stattdessen Null erhalten
In der Textdatei steht:
06.08.24|Einkauf|12,09
07.08.24|Einkauf| 5,00
08.08.24|Einkauf|23,56
Es gibt bestimmt eine einfache Lösung, auf die ich nicht komme.
Wie sieht die aus? Bitte um Hilfe.
Danke und lieber Gruß von soror IngaD.
Re: Split-Funktion
Hallo Inga,
bevor Dir @vuott genau seinen Code erklärt.
Hier noch mal mein alternativer Beitrag, der vielleicht nicht ganz so guter Prommierstil ist.
Entscheidet ist jetzt aber wie Du die Textdatei aufbaust aus der Du liest.
Meine sieht wie folgt aus:
Peter Müller 10,23
Franz Kranz 22,23
Ingo Ganz 44,24
wie gesagt ich verwende Space (" ") zur Trennung Du müsstest dann als Separator "|" bei der Splitfunktion eingeben.
Aber jetzt ganz wichtig.
Die Funktion Val() die Du ja verwendest, um den String sTempListe[2] (siehe die ******** in den Kommentaren meines Code: Val(sTempListe[2] oben)) in eine Fließkommazahl umzuwandeln verwendet zur Trennung den Dezimalstellen das "," und nicht "." , also so wie es im Deutschen Sprachraum üblich ist.
Das ist jetzt genau das was Du Dir erwünscht, aber entscheidend ist, dass Gambas hier keine eigene Regel hat, sondern die
Spracheinstellungen Deines Systems nutzt.
siehe mal hier: https://gambaswiki.org/wiki/lang/val
"The current localization is used for converting numbers and dates. So beware that date, time, decimal and thousands separators change with the language! "
Das ist wichtig, weil es gibt im Gambas auch Funktionen, welche eben nicht die lokalen Einstellungen nutzt.
siehe z.B. https://gambaswiki.org/wiki/lang/cfloat
"Be careful! The current localization is not used by this function.
In other words, if the expression is a string, the decimal separator in the expression MUST be ".", even if in the localization it is defined as "," like in German, French..."
Und genau das könnte bei Deinem Code der Fall sein, aber das wird @vuott Dir ja noch genau zeigen.
Wenn Du in meinem Code oben, die Textdatei in der letzten Spalte mit "." statt "," aufgebaut hättest, dann wäre genau die
von Dir beschriebene Fehlermeldung erschienen.
Abschließend noch einmal.
Es freut mich, wenn ich Dir wirklich helfen konnte, aber ich maße es mir nicht an, mich hier mit den richtigen Profis zu konkurrieren.
Vielleicht kannst Du meinen Ausführungen einige Sachen entnehmen, weil ich gerade selber erst dabei bin, mich in Gambas einzuarbeiten und auf ähnliche Probleme gestoßen bin.
Ich habe aber mittlerweile die Dokus fast durch und freue mich gerade, dass zumindest etwas hängen geblieben ist.
beste Grüße
Poly
bevor Dir @vuott genau seinen Code erklärt.
Hier noch mal mein alternativer Beitrag, der vielleicht nicht ganz so guter Prommierstil ist.
Code: Alles auswählen
Public Sub btnClick_Click()
Dim hFile As File
Dim sPath As String = ""
Dim sTempListe As String[] ' Dieses Array verwendet ich als temporäre Zeile der Datei
Dim sTempString As String
Dim iMaxLine As Integer
Dim sgSumme As Single ' ***********Das ist die Summe aller Punkte**************************
sPath = "./Datentest.txt" ' --> das ist also die Datei
hfile = Open sPath For Read ' --> hier öffne ich die Datei als Stream
While Not Eof(hFile) ' --> ich lese die Datei einmal komplett
Line Input #hFile, sTempString ' --> um die Anzahl der Zeilen zu ermitteln.
Inc iMaxLine
Wend
Seek #hFile, 0 ' --> setzt den Datei-Pointer wieder auf den Anfang, damit ich die Datei noch mal lesen kann.
GridView1.Columns.Count = 3 ' --> Das sind meine drei Spalten
GridView1.Rows.Count = iMaxLine
GridView1.Header = GridView1.Horizontal
GridView1.Columns[0].Text = "Vorname"
GridView1.Columns[1].Text = "Nachname"
GridView1.Columns[2].Text = "Ausgaben"
For i As Integer = 0 To iMaxLine - 1 ' --> Die Anzahl der Spalten sind eine weniger als die ermittelte Zeilen
sTempListe = Split(hFile.ReadLine(), " ") ' ---> wahrscheinlich ist es nicht nötig jede Zeile in eine Liste zu lesen, sondern
GridView1[i, 0].text = sTempListe[0] ' ---> das Ganze geht wohl auch direkt, aber ich finde es so übersichtlicher.
GridView1[i, 1].text = sTempListe[1] ' ---> auch die Tatsache, dass ich hier die Spalten 0 bis 2 aufführen kann mensch
GridView1[i, 2].text = sTempListe[2] ' ---> bestimmt besser machen und mit einer Variablen arbeiten.
sgSumme += Val(sTempListe[2]) '****************** hier werden die einzelnen Punkte aufaddiert. *******************
sTempListe.Clear() ' ---> ich lösche die Liste immer wieder, ist vielleicht auch nicht notwendig, weil sie
Next ' ---> wohl überschrieben wird.
Close #hfile ' das hatte ich noch vergessen. Natürlich solltest Du einen Stream nach der Nutzung wieder schließen.
Print sgSumme ' Das ganze kannst Du jetzt natürlich auch jeden Label oder so ausgeben. Hier nur zur Demonstration.
End
Entscheidet ist jetzt aber wie Du die Textdatei aufbaust aus der Du liest.
Meine sieht wie folgt aus:
Peter Müller 10,23
Franz Kranz 22,23
Ingo Ganz 44,24
wie gesagt ich verwende Space (" ") zur Trennung Du müsstest dann als Separator "|" bei der Splitfunktion eingeben.
Aber jetzt ganz wichtig.
Die Funktion Val() die Du ja verwendest, um den String sTempListe[2] (siehe die ******** in den Kommentaren meines Code: Val(sTempListe[2] oben)) in eine Fließkommazahl umzuwandeln verwendet zur Trennung den Dezimalstellen das "," und nicht "." , also so wie es im Deutschen Sprachraum üblich ist.
Das ist jetzt genau das was Du Dir erwünscht, aber entscheidend ist, dass Gambas hier keine eigene Regel hat, sondern die
Spracheinstellungen Deines Systems nutzt.
siehe mal hier: https://gambaswiki.org/wiki/lang/val
"The current localization is used for converting numbers and dates. So beware that date, time, decimal and thousands separators change with the language! "
Das ist wichtig, weil es gibt im Gambas auch Funktionen, welche eben nicht die lokalen Einstellungen nutzt.
siehe z.B. https://gambaswiki.org/wiki/lang/cfloat
"Be careful! The current localization is not used by this function.
In other words, if the expression is a string, the decimal separator in the expression MUST be ".", even if in the localization it is defined as "," like in German, French..."
Und genau das könnte bei Deinem Code der Fall sein, aber das wird @vuott Dir ja noch genau zeigen.
Wenn Du in meinem Code oben, die Textdatei in der letzten Spalte mit "." statt "," aufgebaut hättest, dann wäre genau die
von Dir beschriebene Fehlermeldung erschienen.
Abschließend noch einmal.
Es freut mich, wenn ich Dir wirklich helfen konnte, aber ich maße es mir nicht an, mich hier mit den richtigen Profis zu konkurrieren.
Vielleicht kannst Du meinen Ausführungen einige Sachen entnehmen, weil ich gerade selber erst dabei bin, mich in Gambas einzuarbeiten und auf ähnliche Probleme gestoßen bin.
Ich habe aber mittlerweile die Dokus fast durch und freue mich gerade, dass zumindest etwas hängen geblieben ist.
beste Grüße
Poly
Zuletzt geändert von Poly am Fr 9. Aug 2024, 20:07, insgesamt 1-mal geändert.
Ceterum censeo Goo..... esse delendam
Re: Split-Funktion
Hallo Poly,
Du bist flott!
Vielen Dank dafür. Bin gerade "auf dem Sprung" und werde mich am WE darum kümmern: der sieht gut aus.
Die Sprache der Gambas-Tutorials ist mir noch fremd. Aber ich hoffe, dass das eines Tages besser klappt mit dem Verständnis (besser Verstand).
Übrigens: Meine Lateinkenntnisse bitte nicht überstrapazieren; das kleine Latinum hatte ich vor etwas mehr als 50 Jahren. Da ist nicht mehr viel übrig.
Ich melde mich bei Dir und lieber Gruß von
IngaD
Du bist flott!
Vielen Dank dafür. Bin gerade "auf dem Sprung" und werde mich am WE darum kümmern: der sieht gut aus.
Die Sprache der Gambas-Tutorials ist mir noch fremd. Aber ich hoffe, dass das eines Tages besser klappt mit dem Verständnis (besser Verstand).
Übrigens: Meine Lateinkenntnisse bitte nicht überstrapazieren; das kleine Latinum hatte ich vor etwas mehr als 50 Jahren. Da ist nicht mehr viel übrig.
Ich melde mich bei Dir und lieber Gruß von
IngaD
Re: Split-Funktion
Ich hatte gar kein Latein, aber den Spruch kennst Du doch oder, also ohne Goo.
Schönes Wochenende, beste Grüße
Poly
Schönes Wochenende, beste Grüße
Poly
Ceterum censeo Goo..... esse delendam
-
- Foriker
- Beiträge: 262
- Registriert: Fr 16. Jan 2015, 01:27
- Wohnort: Europäische Union - Italia
- Kontaktdaten:
Re: Split-Funktion
Italicus frater germanicae sorori salutem dicit !
Man muss die Struktur der Zeichenkette "genau" kennen.
Ich meine: Gibt es ein "Newline"-Byte am Ende jeder Zeile?
D.h. Wert (in hexadezimal) 0A ? Oder gibt es nichts?
Wenn Sie einen Hexadezimal-Editor haben, können Sie dies überprüfen.
Uhmmm... Ich vermute, dass am Ende der letzten Zeile (Hex 0A) ein "Newline"-Escape-Zeichen vorhanden ist.
Europaeus sum
-
- Foriker
- Beiträge: 262
- Registriert: Fr 16. Jan 2015, 01:27
- Wohnort: Europäische Union - Italia
- Kontaktdaten:
Re: Split-Funktion
...und wenn Sie diese Zeile so ändern?
gambas code
gambas code
For n As Byte = 0 To ss.Max - 1 ' ...oder ss.Count - 2 ...etc....
Europaeus sum
Re: Split-Funktion
gambas code
ss = Split(t, gb.NewLine, Null, True)Dadurch entstehen keine Leerzeilen
Ich bin Engländer und verwende Google Übersetzer. (Das tut mir leid)
-
- Foriker
- Beiträge: 262
- Registriert: Fr 16. Jan 2015, 01:27
- Wohnort: Europäische Union - Italia
- Kontaktdaten:
Re: Split-Funktion
Wenn die gesamte Zeichenkette mit dem Wert von 'newline' (&h0A) endet - was sehr wahrscheinlich ist -, ist Ihre Lösung perfekt.
Ich hatte diese Lösung vergessen !
Europaeus sum
Re: Split-Funktion
@vuott und @bonus: Vielen Dank für diesen anderen, effizienteren Lösungsweg.
Dazu habe ich aber paar Fragen und ein Code, welcher bei mir leider nicht so funktioniert wie erhofft.
Zu den Fragen
1.) Ist es generell besser, eine Text-Datei erst in einer Aktion in einen String zu speichern und diesen dann nachher zu splitten?
2.) Wenn dem so ist. Liegt das daran, dass ich die Datei nach dem Laden direkt wieder schließen kann, währen ich sie durch das Einlesen mit Line Input ja länger offen halten muss?
3.) Und wenn dem so ist. Wofür eignet sich dann ein Line Input?
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
und jetzt zu meinen Code, der meiner Meinung nach ein merkwürdiges Verhalten zeigt.
Ich habe dabei einen Teil Eures Lösungsweges versucht anzuwenden.
gambas code
gambas code
Bad row index (Fmain 45) Error
das kann auch nicht an der Split-Anweisung : Split(sTempListe[iCount], " ")[0...3] liegen
ich bekomme diesen Fehler auch, wenn ich folgendes schreibe:
gambas code
während, wie oben gezeigt
gambas code
Wenn ich also die Gridview.Koordinaten mit laterale Konstanten (0..1...2) schreibe funktioniert es, aber es nicht ermöglicht für die Reihe des Grid-Views eine Variable zu verwenden.
in meinem anderen Code den ich vorne gezeigt habe, war das kein Problem.
Gambas scheint im Falle von
gambas code
GridView1[iRow, 0].text
zu ersetzen ?????
Es ist im übrigen auch egal, wie ich diese Variable deklariere, also auch als Integer, Short, etc.
und auch ob ich die Deklaration schon am Anfang der Datei vornehme und dann in der Schleife das As ... weglasse.
Es wird mir immer der gleiche Fehler angezeigt.
Da das ganze mit allen Versionen Gambas 3.16.2, 3.18.3 und 3.19.3 genauso ist, muss es da irgendwie ein Fehler in meinen Code geben???
Ich bekomme das Problem zwar anderes gelöst, aber ich wollte ausprobieren, wie ich das ganze löse ohne eine zweite temporäre Liste zu erstellen und stattdessen mit dem Konstrukt Split(sTempListe[iCount], " ")[0] zu arbeiten, welche mit dann z.B., das erste Element liefern sollte.
Wäre sehr nett, wenn mir das vielleicht einer erklären könnte.
Danke
Dazu habe ich aber paar Fragen und ein Code, welcher bei mir leider nicht so funktioniert wie erhofft.
Zu den Fragen
1.) Ist es generell besser, eine Text-Datei erst in einer Aktion in einen String zu speichern und diesen dann nachher zu splitten?
2.) Wenn dem so ist. Liegt das daran, dass ich die Datei nach dem Laden direkt wieder schließen kann, währen ich sie durch das Einlesen mit Line Input ja länger offen halten muss?
3.) Und wenn dem so ist. Wofür eignet sich dann ein Line Input?
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
und jetzt zu meinen Code, der meiner Meinung nach ein merkwürdiges Verhalten zeigt.
Ich habe dabei einen Teil Eures Lösungsweges versucht anzuwenden.
gambas code
Public Sub btnClick_Click() Dim hFile As File Dim sPath As String = "" Dim sTempListe As String[] Dim sDatei As String Dim sgSumme As Single 'Datei laden und in sDatei als kompletten String speichern sPath = "./Datentest.txt" hfile = Open sPath For Read sDatei = hFile.Load(sPath) ' File wird nicht mehr gebraucht und deshalb geschlossen Close #hFile 'Die Datei wird gespalten bei NewLine, Escapezeichen ist Null und leere Elemtente werden ignoriert. sTempListe = Split(sDAtei, gb.NewLine, Null, True) ' Hier werden zu überPrüfung einfach verschiedene Elemente ausgegeben Print sTempListe[0] Print Split(sTempListe[0], " ")[1] Print sTempListe.Max GridView1.Columns.Count = 3 GridView1.Rows.Count = sTempListe.Max 'auch mit einer Zahl wie 6 wird der Fehler nicht behoben GridView1.Header = GridView1.Horizontal GridView1.Columns[0].Text = "Vorname" GridView1.Columns[1].Text = "Nachname" GridView1.Columns[2].Text = "Alter" For iCount As Byte = 0 To sTempListe.Max GridView1[0, 0].text = Split(sTempListe[iCount], " ")[0] GridView1[1, 1].text = Split(sTempListe[iCount], " ")[1] GridView1[2, 2].text = Split(sTempListe[iCount], " ")[2] sgSumme += Val(Split(sTempListe[iRow], " ")[2]) Next EndDas Problem ist, wenn ich in der for-Schleife folgendes schreibe:
gambas code
For iRow As Byte = 0 To sTempListe.Max GridView1[iRow, 0].text = Split(sTempListe[iCount], " ")[0] GridView1[iRow, 1].text = Split(sTempListe[iCount], " ")[1] GridView1[iRow, 2].text = Split(sTempListe[iCount], " ")[2] Nextdann bekomme ich immer ein
Bad row index (Fmain 45) Error
das kann auch nicht an der Split-Anweisung : Split(sTempListe[iCount], " ")[0...3] liegen
ich bekomme diesen Fehler auch, wenn ich folgendes schreibe:
gambas code
For iRow As Byte = 0 To sTempListe.Max GridView1[iRow, 0].text = "Eins" GridView1[iRow, 1].text = "Zwei" GridView1[iRow, 2].text = "Drei" Next
während, wie oben gezeigt
gambas code
For iCount As Byte = 0 To sTempListe.Max GridView1[0, 0].text = Split(sTempListe[iCount], " ")[0] GridView1[1, 1].text = Split(sTempListe[iCount], " ")[1] GridView1[2, 2].text = Split(sTempListe[iCount], " ")[2] Nextkeinen Fehler liefert.
Wenn ich also die Gridview.Koordinaten mit laterale Konstanten (0..1...2) schreibe funktioniert es, aber es nicht ermöglicht für die Reihe des Grid-Views eine Variable zu verwenden.
in meinem anderen Code den ich vorne gezeigt habe, war das kein Problem.
Gambas scheint im Falle von
gambas code
For iRow As Byte = 0 To sTempListe.Max GridView1[iRow, 0].text = "Eins" GridView1[iRow, 1].text = "Zwei" GridView1[iRow, 2].text = "Drei" NextDie Variable iRow nicht im Ausdruck
GridView1[iRow, 0].text
zu ersetzen ?????
Es ist im übrigen auch egal, wie ich diese Variable deklariere, also auch als Integer, Short, etc.
und auch ob ich die Deklaration schon am Anfang der Datei vornehme und dann in der Schleife das As ... weglasse.
Es wird mir immer der gleiche Fehler angezeigt.
Da das ganze mit allen Versionen Gambas 3.16.2, 3.18.3 und 3.19.3 genauso ist, muss es da irgendwie ein Fehler in meinen Code geben???
Ich bekomme das Problem zwar anderes gelöst, aber ich wollte ausprobieren, wie ich das ganze löse ohne eine zweite temporäre Liste zu erstellen und stattdessen mit dem Konstrukt Split(sTempListe[iCount], " ")[0] zu arbeiten, welche mit dann z.B., das erste Element liefern sollte.
Wäre sehr nett, wenn mir das vielleicht einer erklären könnte.
Danke
Ceterum censeo Goo..... esse delendam
Re: Split-Funktion
GridView1.Rows.Count = sTempListe.Max ??
Try
GridView1.Rows.Count = sTempListe.Count
Try
GridView1.Rows.Count = sTempListe.Count
Zuletzt geändert von Bonus am Di 13. Aug 2024, 23:23, insgesamt 2-mal geändert.
Ich bin Engländer und verwende Google Übersetzer. (Das tut mir leid)
Re: Split-Funktion
Vielen Dank für Deine schnelle Antwort @Bonus
sTempListe.Count = 7 ---> ich habe sieben Datensätze
deshalb ist
For iRow = 0 To sTempListe.Count ---> Außerhalb der Array-Grenzen (out of bounds)
und
For iRow = 0 To sTempListe.Count -1 --> ergibt den gleichen Fehler Bad row index (Fmain 51)
sTemplListe.Max ---> ergibt den Wert des höchsten Index von sTempliste, das ist sTempilste[6] --> also 6
Die Markierung beim Ausführen des Codes Springt auf das *iRow* in z.B.
GridView1[iRow, 0].text = Split(sTempListe[iRow], " ")[0] ---> Bad row index (Fmain 51)
ich mache wahrscheinlich etwas grundlegendes falsch, aber ich habe es ja schon mit allen möglichen anderen Sachen getestet.
Wenn ich die Zahlen per Hand eingeben, dann läuft es prima, aber dann kann ich mir die Schleife ja sparen.
also:
gambas code
läuft prima durch.
Aus irgendwelchen Gründen akzeptiert er hier bei dem
GriedView[Row, Column] keine Variablen??
Ganz lieben Dank, dass Du Dir das so schnell angesehen hast und das obwohl gerade eine neue Gambas Version getestet werden muss
sTempListe.Count = 7 ---> ich habe sieben Datensätze
deshalb ist
For iRow = 0 To sTempListe.Count ---> Außerhalb der Array-Grenzen (out of bounds)
und
For iRow = 0 To sTempListe.Count -1 --> ergibt den gleichen Fehler Bad row index (Fmain 51)
sTemplListe.Max ---> ergibt den Wert des höchsten Index von sTempliste, das ist sTempilste[6] --> also 6
Die Markierung beim Ausführen des Codes Springt auf das *iRow* in z.B.
GridView1[iRow, 0].text = Split(sTempListe[iRow], " ")[0] ---> Bad row index (Fmain 51)
ich mache wahrscheinlich etwas grundlegendes falsch, aber ich habe es ja schon mit allen möglichen anderen Sachen getestet.
Wenn ich die Zahlen per Hand eingeben, dann läuft es prima, aber dann kann ich mir die Schleife ja sparen.
also:
gambas code
For iRow = 0 To sTempListe.Count - 1 GridView1[2, 0].text = Split(sTempListe[iRow], " ")[0] GridView1[3, 1].text = Split(sTempListe[iRow], " ")[1] GridView1[3, 2].text = Split(sTempListe[iRow], " ")[2] sgSumme += Val(Split(sTempListe[iRow], " ")[2]) Next
läuft prima durch.
Aus irgendwelchen Gründen akzeptiert er hier bei dem
GriedView[Row, Column] keine Variablen??
Ganz lieben Dank, dass Du Dir das so schnell angesehen hast und das obwohl gerade eine neue Gambas Version getestet werden muss
Zuletzt geändert von Poly am Di 13. Aug 2024, 23:44, insgesamt 3-mal geändert.
Ceterum censeo Goo..... esse delendam
Wer ist online?
Mitglieder in diesem Forum: Ahrefs [Bot], Google [Bot] und 0 Gäste