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:

Mit INSTR nach "," suchen
Gehe zu Seite 1, 2  Weiter
 
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
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 14.03.2022, 09:09    Titel: Mit INSTR nach "," suchen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 14.03.2022, 14:35    Titel: Re: Mit INSTR nach "," suchen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 107

BeitragVerfasst am: 14.03.2022, 15:50    Titel: Antworten mit Zitat

Code:

...
Dim TR as string
TR =  chr$(34) &  "," & chr$(34)
...
P = instr(txt,TR)


Evtl. + statt & verwenden.

 
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.03.2022, 16:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 14.03.2022, 17:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.03.2022, 17:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 14.03.2022, 18:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.03.2022, 19:13    Titel: Antworten mit Zitat

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. traurig
_________________
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: 15.03.2022, 13:15    Titel: Antworten mit Zitat

@kilix: Wenn meine Antwort etwas unfreundlich rübergekommen sein sollte, bitte ich um Entschuldigung, das war nicht meine Absicht. traurig

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 107

BeitragVerfasst am: 15.03.2022, 14:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 15.03.2022, 16:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 15.03.2022, 19:41    Titel: Antworten mit Zitat

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!! lächeln
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 16.03.2022, 19:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 17.03.2022, 20:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 17.03.2022, 20:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 17.03.2022, 21:09    Titel: Antworten mit Zitat

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 lächeln und so kommt es zu solchen Problemen
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 17.03.2022, 21:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 17.03.2022, 21:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

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

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
Benutzer-Profile anzeigen Private Nachricht senden
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 18.03.2022, 09:24    Titel: Antworten mit Zitat

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
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
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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