Position von String herausfinden
Moderator: Moderatoren
Position von String herausfinden
Hallo,
kann man die Startposition für einen String bestimmen, nachdem man mit MemoRead einen mehrzeiligen Text übergeben hat, ohne den kompletten Text erst in ein Array einzulesen. Ich suche quasi nach einem at(), halt für die entsprechende Zeile.
Danke
kann man die Startposition für einen String bestimmen, nachdem man mit MemoRead einen mehrzeiligen Text übergeben hat, ohne den kompletten Text erst in ein Array einzulesen. Ich suche quasi nach einem at(), halt für die entsprechende Zeile.
Danke
Re: Position von String herausfinden
Du bekommst mit at() auch die Position in einem Mehrzeiler heraus, aber nie die Zeilennummer.
Du müsstest den Text entweder zeilenweise einlesen oder mit einer nicht exisitierenden Hilfsfunktion [bei uns heißt die String2Array(cText, cTrenner)] in ein Array schieben und den in einer Schleife mit at() behandeln.
Du müsstest den Text entweder zeilenweise einlesen oder mit einer nicht exisitierenden Hilfsfunktion [bei uns heißt die String2Array(cText, cTrenner)] in ein Array schieben und den in einer Schleife mit at() behandeln.
Re: Position von String herausfinden
Die Zeile an sich ist mir auch egal, ich brauche die Spalte.
Gibt es evtl. die Möglichkleit den Text mit Leerzeichen zu füllen das jede Zeile gleich lang ist, dann könnte man es über Modulo herausfinden.
Gibt es evtl. die Möglichkleit den Text mit Leerzeichen zu füllen das jede Zeile gleich lang ist, dann könnte man es über Modulo herausfinden.
Re: Position von String herausfinden
Die Spalte weißt du ja dann auch, zusammen mit der Zeile.
Ohne auseinerlegen bekommst du es nicht hin, da ein PADR hier nicht zeilenweise arbeiten kann.
Ohne auseinerlegen bekommst du es nicht hin, da ein PADR hier nicht zeilenweise arbeiten kann.
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Position von String herausfinden
Servus,
Du kennst die Funktionen
Du kennst die Funktionen
?mlCount()
MemoLine()
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
Re: Position von String herausfinden
@vorti
Mache es so wie in den vorherigen Beiträgen schon geschrieben wurde.
Denke aber daran, die Tab-Länge auf 1 und die Zeilenlänge ausrechend groß zu machen (z.B. 250) damit Du keinen ungewollten Zeilenumbruch bekommst.
Mit Spalte meinst Du vermutlich die Anzahl Zeichen nach dem letzten CR/LF...
Mache es so wie in den vorherigen Beiträgen schon geschrieben wurde.
Denke aber daran, die Tab-Länge auf 1 und die Zeilenlänge ausrechend groß zu machen (z.B. 250) damit Du keinen ungewollten Zeilenumbruch bekommst.
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Position von String herausfinden
hi
zunächst bekommst man mit MEMOREAD ja nur einen "durchgehenden" String d.h. 1 Zeile -> AT() == Spalte.
nun sind aber im String , bei mehreren Zeilen, vermutlich CRLF vorhanden.
mögliche Lösungen :
1.) wie du schon sagtest jeweils nach CRLF suchen.
Array wäre unnötig wenn du es "sofort" prüfst "ob" der Such-Begiff in der Zeile ist.
2.) MemoEdit oder XbpMLE verwenden und das Fenster anpassen
zu 1.) nicht getestet
zu 2.) grob gesagt : du brauchst eine "Begrenzung" damit ein CRLF "wirken" kann.
bei MemoEdit gibt es ja die UDF und bei XbpMLE gibt es den o:Keyboard Slotes wird damit, in der Statuszeile (::StatText), die aktuelle Cursor Position angezeigt -> gesuchte Spalte
Frage : wozu benötigst du die Zeile/Spalte
vielleicht gibt es auch andere Lösungen ... ![Whistle :-"](./images/smilies/eusa_whistle.gif)
zunächst bekommst man mit MEMOREAD ja nur einen "durchgehenden" String d.h. 1 Zeile -> AT() == Spalte.
nun sind aber im String , bei mehreren Zeilen, vermutlich CRLF vorhanden.
mögliche Lösungen :
1.) wie du schon sagtest jeweils nach CRLF suchen.
Array wäre unnötig wenn du es "sofort" prüfst "ob" der Such-Begiff in der Zeile ist.
2.) MemoEdit oder XbpMLE verwenden und das Fenster anpassen
zu 1.) nicht getestet
Code: Alles auswählen
cText := MemoRead("MeinText.TXT")
nStart := 1
DO WHILE .T.
nPosi := AT(CRLF,cText,nStart)
IF nPosi > 0
// eine Zeile
cLine := SUBSTR(cText,nStart,nPosi-nStart)
IF AT(cSuch,cLine) > 0
Do_Found(cLine)
ENDIF
nStart := nPosi +2 // CRLF
ELSE
EXIT
ENDIF
ENDDO
bei MemoEdit gibt es ja die UDF und bei XbpMLE gibt es den o:Keyboard Slot
Code: Alles auswählen
METHOD CalDetail:MyKey(nKey,oMLE)
LOCAL nEnde := oMLE:pos()
LOCAL nLine := oMLE:lineFromChar(nEnde)
LOCAL nZeil := oMLE:charFromLine(nLine)
LOCAL cText := "Row "+LTRIM(STR(nLine))+" / Col "+LTRIM(STR(nEnde-nZeil))
LOCAL cKey
cKey := UPPER(CHR(nKey))
DO CASE
CASE nKey = xbeK_CTRL_Z
oMLE:undo()
ENDCASE
::StatText:SetCaption(cText)
RETURN self
Frage : wozu benötigst du die Zeile/Spalte
![Question :?:](./images/smilies/question.gif)
![Whistle :-"](./images/smilies/eusa_whistle.gif)
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Position von String herausfinden
Wie immer eine Frage der Zeilen und Spalten Trenner !
Erst den kompletten Text einlesen
cText := memoread(...)
Dann die Byteposition des Suchstrings mit AT() suchen, ist der aber wirklich eindeutig ???
nStartPos := At(cSuchBegriff, cText)
Der LINKE Teil vor dieser Position sind alle Zeilen davor und auch die Spalten bzw. Zeichen in der aktuellen Spalte.
Zeilen Erkennt man am CRLF =>
cVorText := left(cText,nStartPos-1)
// in welcher Zeile, Anzahl CRLF ermitteln ?
nAktuelleZeile := ((len(cText)-len(strtran(cText,chr(13)+chr(10),"")))/2)+1
// alle Zeilen vor aktueller eliminieren
nZeilenStart := RAt(chr(13)+chr(10), cVorText)
if nZeilenStart > 0 dann nZeilenStart += 2
// nun die aktuelle Zeile vor dem Suchbegriff
cZeile := substr(cVorText,nZeileStart)...
nun so weiter mit den Spaltentrennern und hoffen dass die eindeutig sind.
Bei CSV z.B. sind sie es nicht, da , oder ; oder " sowohl im Text als auch als Steuerzeichen in Verwendung sind.
PS: ich habe das oben nicht getestet, es könnte also sein, dass ab und zu ein -1 / +1 oder INT() nötig ist.
Am Besten mit Debugger oder ? Ergebnis Ausgabe testen bis alles stimmt.
Erst den kompletten Text einlesen
cText := memoread(...)
Dann die Byteposition des Suchstrings mit AT() suchen, ist der aber wirklich eindeutig ???
nStartPos := At(cSuchBegriff, cText)
Der LINKE Teil vor dieser Position sind alle Zeilen davor und auch die Spalten bzw. Zeichen in der aktuellen Spalte.
Zeilen Erkennt man am CRLF =>
cVorText := left(cText,nStartPos-1)
// in welcher Zeile, Anzahl CRLF ermitteln ?
nAktuelleZeile := ((len(cText)-len(strtran(cText,chr(13)+chr(10),"")))/2)+1
// alle Zeilen vor aktueller eliminieren
nZeilenStart := RAt(chr(13)+chr(10), cVorText)
if nZeilenStart > 0 dann nZeilenStart += 2
// nun die aktuelle Zeile vor dem Suchbegriff
cZeile := substr(cVorText,nZeileStart)...
nun so weiter mit den Spaltentrennern und hoffen dass die eindeutig sind.
Bei CSV z.B. sind sie es nicht, da , oder ; oder " sowohl im Text als auch als Steuerzeichen in Verwendung sind.
PS: ich habe das oben nicht getestet, es könnte also sein, dass ab und zu ein -1 / +1 oder INT() nötig ist.
Am Besten mit Debugger oder ? Ergebnis Ausgabe testen bis alles stimmt.
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Position von String herausfinden
Es geht noch einfacher
Gruss Carlo
Code: Alles auswählen
cText := memoread(...)
nZeile := 0
if ( nStartPos := At(cSuchBegriff, cText) ) > 0
nZeile := numtoken( left(cText, nStartPos-1), chr(13) ) +1
endif
Valar Morghulis
Gruss Carlo
Gruss Carlo