|
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 |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 14.03.2022, 10:09 Titel: Mit INSTR nach "," suchen |
|
|
Hallo,
ich lese Daten aus einer CSV-Datei ein. Die einzelnen Felder sind mit "," getrennt. Mit INSTR kann ich wohl nach dem Komma suchen aber nicht in der angegebenen Kombination mit den Hochkomma.
Ich habe es schon mit INSTR("ABC", '","') - also "," zwischen Apostrophe zu setzen - versucht, wie ich das aus anderem Zusammenhang kenne, aber das passt hier nicht.
Wie muss ich INSTR codieren, um nach "," zu suchen? _________________ Grüße
kilix |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 14.03.2022, 15:35 Titel: Re: Mit INSTR nach "," suchen |
|
|
kilix hat Folgendes geschrieben: | ...aber nicht in der angegebenen Kombination mit den Hochkomma. | Welche Kombination mit welchem Hochkomma? Ich kann zwar ganz leidlich programmieren, aber ich bin kein Hellseher (und ich denke mal, die anderen hier auch nicht). Wenn du eine brauchbare Antwort bekommen möchtest, mußt du dein Problem schon etwas präziser beschreiben.
Und das Apostroph kennzeichnet in FB den Beginn eines Kommentars.
Zitat: | Wie muss ich INSTR codieren, um nach "," zu suchen? | Zum Beispiel so: Code: | Dim As String g
g = "Wer in FB nicht weiter weiss, sollte die Befehlsreferenz lesen"
Print InStr(g, ",")
Sleep |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
Verfasst am: 14.03.2022, 16:50 Titel: |
|
|
Code: |
...
Dim TR as string
TR = chr$(34) & "," & chr$(34)
...
P = instr(txt,TR) |
Evtl. + statt & verwenden.
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 14.03.2022, 17:43 Titel: |
|
|
Wenn ich die Frage richtig verstehe, geht es darum, dass ein Komma innerhalb eines Strings ignoriert werden soll (also wie das halt in CSV üblich ist). Falls ich mit dieser Annahme recht habe:
Du kannst mit INPUT# bis zum nächsten Komma einlesen. In Anführungszeichen eingeschlossener Text wird zusammenhängend eingelesen; die Anführungszeichen werden dabei "weggeworfen". _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 14.03.2022, 18:26 Titel: |
|
|
Vielen Dank für eure Antworten! Auf den Vorschlag von HorstD hätte ich mit etwas Fantasie selbst auch kommen können, danke dafür!
Den Hinweis von nemored nehme ich gerne auf, denn das scheint ein für mich ein gangbarer Weg zu sein.
Was die Befehlsreferenz betrifft lese ich immer wieder darin aber leider leider ist sie, für mich, oft so theoretisch, dass ich es nicht verstehe. Mir fehlt der Praxisbezug und ausführlichere Code-Beispiele.
Aber wie ich aus meiner letzten Anfrage sehe gibt es meist doch recht einfache und schnelle Antworten die weiterhelfen.
Dazu kommt die Frage: wonach hätte ich in der Befehlsreferenz suchen sollen, um Antwort zu erhalten? Unter INSTR steht nichts diesbezügliches.
Was INPUT # betrifft so muss ich mich noch mehr damit befassen aber die Befehlsreferent sagt mir nur, dass ich damit eine bestimmte Anzahl Zeichen aus einer Datei einlesen kann. _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 14.03.2022, 18:40 Titel: |
|
|
Es gibt INPUT als Funktion, da kann man eine feste Anzahl an Zeichen einlesen (aus einer Datei oder der Tastatur). Was ich aber meinte, ist das hier:
https://www.freebasic-portal.de/befehlsreferenz/input-datei-316.html
Die Referenz ist halt eine Referenz - gut zum Nachschlagen (hoffe ich), aber kein Lehrbuch. Vielleicht hilft dir mein völlig unvollständiges Einsteiger-Handbuch weiter - möglicherweise auch etwas theoretisch (auch ein Handbuch ist kein Lehrbuch), aber mit etwas mehr Erklärungen drum herum.
https://www.freebasic-portal.de/projekte/openbook-einsteigerhandbuch-99.html
edit: Dateien finden sich im Einsteiger-Handbuch in Kapitel 16.
(noch ein edit: Es gibt auch schon ein unfertiges Kapitel 19.) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 14.03.2022, 19:21 Titel: |
|
|
Hallo nemored,
danke für die Links! Bei Befehlsreferenz bezog ich mich auf Dokument vom FreeBasic Portal: FreeBASIC-Befehlsreferenz und nicht auf die im Portal enthaltene Befehlsreferenz (die ich mir zusätzlich öfter ansehen muss!).
Der von dir dorthin angegebene Link zeigt genau das was ich zum Einlesen der CSV-Dateien (aus Excel) codiert habe.
Jetzt muss ich aus den Sätzen dieser CSV-Dateien einzelne Felder herausholen. Da die Felder in den Sätzen unterschiedlich lang sind muss ich von Trennzeichen bis Trennzeichen arbeiten. Die Trennzeichen sind Kommas (,). Aber jedes Feld beginnt und endet mit ", es sind alles Strings. D.h., um ein Feld zu bekommen muss ich auch die beiden " entfernen. Um das zu vereinfachen will ich mit INSTR nicht nach , suchen sondern nach ",".
Wie muss der INPUT # -Befehl dazu aussehen? Leider habe ich dazu in keiner Befehlsreferenz oder in den Beispielen was gefunden.
Was das andere Problem mit dem GET-Befehl betrifft, siehe früheren Thread, so war es wie ich zum Schluss vermutet habe ein ganz anderer Fehler der dazu führte, dass ich auf einen Satz nach dem EOF zugreifen wollte. Das ist richtig gestellt und funktioniert jetzt gut. Auch sonst komme ich mit dem Programmieren schon recht gut zu Rande (schließlich ist Basic für mich nicht gänzlich neu, es hat sich nur in der langen Zeit einiges verändert). Es sind halt immer mal so spezielle Frage (s.o.) mit denen ich mich hier melde.
Auf jeden Fall bin ich sehr dankbar für die Geduld die ihr hier aufbringt, um mir zu helfen! _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 14.03.2022, 20:13 Titel: |
|
|
CSV-Datei "test.csv"
Code: | "Das","ist","ein","kleiner, feiner","Datensatz" |
Programmcode:
Code: | dim as string a
open "test.csv" for input as #1
for i as integer = 1 to 5
input #1, a
print a
next |
Ausgabe:
Code: | Das
ist
ein
kleiner, feiner
Datensatz |
Wie du siehst, sind die Anführungszeichen auch gleich weg.
Die herunterladbare Befehlsreferenz ist leider inzwischen sehr veraltet. _________________ 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: 1220 Wohnort: Ruhrpott
|
Verfasst am: 15.03.2022, 14:15 Titel: |
|
|
@kilix: Wenn meine Antwort etwas unfreundlich rübergekommen sein sollte, bitte ich um Entschuldigung, das war nicht meine Absicht.
nemored hat deine Frage ja schon erschöpfend beantwortet, ergänzend könnte man noch hinzufügen, daß in FB Anführungsstriche verdoppelt werden, wenn sie als Literal dargestellt werden sollen. Code: | Open ExePath + "\test.csv" For Output As #1
Print #1, """Das"",""ist"",""ein"",""kleiner, feiner"",""Datensatz"""
Close #1 | erzeugt die im Beispiel verwendete Datei "test.csv".
nemored hat Folgendes geschrieben: | Die herunterladbare Befehlsreferenz ist leider inzwischen sehr veraltet. | Es sollte doch nicht allzu schwer sein, aus der Online-Version eine aktuelle CHM-Datei zu erstellen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
Verfasst am: 15.03.2022, 15:21 Titel: |
|
|
Code: | Dim As String feld1,feld2,feld3,feld4,feld5
Dim z As Integer
Dim ff As Integer
'Eine test.csv erstellen
ff = FreeFile
Open "d:\#1\csvtest.csv" For Output As #ff
write #ff,"das", "ist","die","zeile","eins"
write #ff,"das", "ist","die","zeile","zwei"
write #ff,"das", "ist","die","zeile","drei"
Close
'csv Zeilenweise lesen
ff = FreeFile
Open "d:\#1\csvtest.csv" For Input As #ff
While Not Eof(ff)
z+= 1 'Zeilenzähler
Input #ff, feld1,feld2,feld3,feld4,feld5
'Hier können die einzelnen Felder der csv-Zeile (Datensatz, DS)
' verarbeitet werden
Print "DS";z;" : ",feld4,feld5
Wend
Close
GetKey 'warte auf Taste |
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 15.03.2022, 17:16 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Es sollte doch nicht allzu schwer sein, aus der Online-Version eine aktuelle CHM-Datei zu erstellen. |
Ich bin wirklich schon am Überlegen, ob ich mir die komplette Referenz mit wget herunterziehen und eine "inoffizielle" Offline-Version zusammenstellen soll. Da müsste ich nur noch irgendwann die Zeit finden, aus dem Quelltext die notwendigen Elemente zu extrahieren (beim Faktor Zeit liegt das Hauptproblem ...)
CHM kann ich allerdings nicht. Aber ein schickes kleines Konsolenprogramm, das über den übergebenen Parameter die anzuzeigende Seite ermittelt und ein passendes Anzeigefenster öffnet, hätte schon was.
Sorry für OT. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 15.03.2022, 20:41 Titel: |
|
|
Ich danke euch für eure Mühe und Geduld! Ich bin leider z.Z. anderweitig sehr beschäftigt und kann mich nicht um FB kümmern. Aber das kommt sicher noch denn je mehr ich mich damit beschäftige umso mehr freut es mich. Das war damals mit dem DEC Basic auch so - umso mehr als ich kein Programmierer war und das programmierte was mir gerade half. Z.B. eine quick and dirty Lagerwert-Analyse.
@grindstone, ja es kam etwas spitz herüber aber es ist schon vergessen!! _________________ Grüße
kilix |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 16.03.2022, 20:20 Titel: |
|
|
Hab jetzt doch Zeit gefunden wieder was mit FB zu machen.
Danke Horst! Brauchte deinen Code nur kopieren und anpassen! Bin begeistert wie einfach das in FB geht. Leider hab ich solche Goodies sonst nirgendst gefunden.
Die Zerlegung des CSV-Datensatzes mit INSTR und MID hat mich Stunden gekostet dabei konnte ich das mit dem INPUT f Befehl in Minuten machen. _________________ Grüße
kilix |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 17.03.2022, 21:54 Titel: |
|
|
Jetzt hab ich mich über den befehl INPT # zu früh gefreut. In einem Feld kommt im Text ein "i" vor und da stolpert der Befehl und verschiebt die danach kommenden Felder.
D.h. ich muss doch mit INSTR und MID arbeiten oder den Satz nach jedem Feld und dieses Feld verkürzen, so dass das nächste zu lesende Feld immer das erste ist. _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 17.03.2022, 21:58 Titel: |
|
|
Kannst du das etwas konkretisieren - wie sieht die Eingabezeile aus und woran stolpert es? Vielleicht sieht man dann einen Lösungsansatz.
Das, was ich mir bisher unter deiner Beschreibung vorstelle, ist eine fehlerhaft aufgebaute CSV-Datei. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 17.03.2022, 22:09 Titel: |
|
|
Die Zeile sieht so aus:
"37","Cheau-Vie","das bairische Urvieh mit "i"","cheauvie","43","","","FALSE","TRUE","FALSE","2","","4","FALSE","1999-08-06","10","1999-11-10 08:17:33.000","lutz"
Beim Feld "das bairische Urvieh mit "i"" stolpert INPUT # über das "i"
kurze Erklärung: ich schreibe an einer Vereinssoftware und im Verein haben alle Mittglieder oft seltsame Spitznamen und so kommt es zu solchen Problemen _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 17.03.2022, 22:23 Titel: |
|
|
Da hält sich die Software offenbar nicht an die Regeln:
Wikipedia hat Folgendes geschrieben: | Um Sonderzeichen innerhalb der Daten nutzen zu können (z. B. Komma in Dezimalzahlwerten), wird ein Feldbegrenzerzeichen (auch: Textbegrenzungszeichen) benutzt. Normalerweise ist dieser Feldbegrenzer das Anführungszeichen ". Wenn der Feldbegrenzer selbst in den Daten enthalten ist, wird dieser im Datenfeld verdoppelt |
(https://de.wikipedia.org/wiki/CSV_(Dateiformat); Hervorhebung durch mich)
Richtig wäre
Code: | "37","Cheau-Vie","das bairische Urvieh mit ""i""","cheauvie","43","","","FALSE","TRUE", "FALSE","2","","4","FALSE","1999-08-06","10","1999-11-10 08:17:33.000","lutz" |
Ich fürchte, wenn jemand im Namen kein "i" sondern ein "," hat, crasht es wirklich gewaltig ...
Ich poste nachher mal einen Lösungsvorschlag (der aber bei einem "," auch nicht funktionieren würde - da würde nämlich gar nichts mehr helfen). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 17.03.2022, 22:29 Titel: |
|
|
Ich hatte das Komma innerhalb einer Adresse als ich nach Komma als Feldbegrenzer suchte. Ich konnte nur die Zeichen davor und dahinter auf Ascii 34 prüfen. Gab es die nicht war es ein Textteil gab es die schon ein Begrenzer.
Gut hier liegt das Problem anders aber, dass "," innerhalb des Textes vorkommen wird glaube ich nicht denn das kann man nicht aussprechen während man das i ausprechen kann. _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 17.03.2022, 23:02 Titel: |
|
|
Wenn man will, kann man sich solche Namen schon ausdenken.
Zitat: | "Konstantin Mader, auch bekannt als ","" |
Gerade bei Vereinsnamen halte ich nichts für unmöglich ...
Hier eine Parserversion; allerdings darf bei ihr in den inneren Anführungszeichen keinerlei Komma vorkommen. Die Vorgehensweise ist folgende: Bei einem "öffnenden" Anführungszeichen merkt sich das Programm, dass es ab sofort Kommata ignorieren soll; nach einem "schließenden" Anführungszeichen wird ein Komma wieder akzeptiert. Die Idee ist zwar recht elegant, kann aber wie gesagt aus dem Tritt gebracht werden, wenn sich die Eingabe nicht an die Regeln hält.
Code: | const ASC_ANFUEHR = asc(""""), ASC_KOMMA = asc(",")
function sucheKomma(text as string) as integer
' sucht das nächste Komma; überspringt dabei Text in Anführungszeichen
dim as boolean anfuehrungszeichen = false
for i as integer = 0 to len(text)-1
if text[i] = ASC_ANFUEHR then anfuehrungszeichen = not anfuehrungszeichen
if anfuehrungszeichen = false andalso text[i] = ASC_KOMMA then return i+1
next
return 0
end function
dim as string eingabe, wert
dim as integer komma
open "test.csv" for input as #1
line input #1, eingabe
for i as integer = 1 to 5
komma = sucheKomma(eingabe)
if komma then
wert = left(eingabe, komma-1)
eingabe = mid(eingabe, komma+1)
else
wert = eingabe
eingabe = ""
end if
' Anführungszeichen am Anfang und Ende verwerfen
if left(wert, 1) = """" and right(wert, 1) = """" then
wert = mid(wert, 2, len(wert)-2)
end if
print komma, wert
next
|
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 18.03.2022, 10:24 Titel: |
|
|
danke für diese Mühe!
ich hab den Code in wxFBE kopiert und auf meine csv-Datei geändert. Leider markiert wxFBE die Zeile
Code: | dim as BOOLEAN anfuehrungszeichen = false |
Die Fehlermeldung ist:
Expected identifier, found 'BOOLEAN' in 'dim as BOOLEAN anfuehrungszeichen'
Ich habe im Internet herumgesucht, habe aber nichts gefunden. Die Schreibweise dieser Zeile habe ich zwar in Beispielen nur mit "true" gefunden aber das kann nicht der Grund für die Fehllermeldung sein.
Sonst ist der Code für mich verständlich bis auf die Frage warum du die FOR-Schleife von 1-5 laufen lässt. Das hat sicher mit den zeichenkombinationen zu tun und wenn das Beispiel läuft werde ich das auch sehen.
Ich muss dann nur noch die Verarbeitung auf alle Datensätze erweitern. _________________ Grüße
kilix |
|
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.
|
|