Position von String herausfinden

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Position von String herausfinden

Beitrag von vorti »

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
psp
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 250
Registriert: Do, 22. Okt 2009 13:42
Kontaktdaten:

Re: Position von String herausfinden

Beitrag von psp »

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.
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: Position von String herausfinden

Beitrag von vorti »

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.
psp
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 250
Registriert: Do, 22. Okt 2009 13:42
Kontaktdaten:

Re: Position von String herausfinden

Beitrag von psp »

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.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Position von String herausfinden

Beitrag von Werner_Bayern »

Servus,

Du kennst die Funktionen
mlCount()
MemoLine()
?
es grüßt

Werner

<when the music is over, turn off the lights!>
DelUser01

Re: Position von String herausfinden

Beitrag von DelUser01 »

@vorti
vorti hat geschrieben: Do, 23. Nov 2017 12:43Die Zeile an sich ist mir auch egal, ich brauche die Spalte.
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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Position von String herausfinden

Beitrag von AUGE_OHR »

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

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   
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 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
es 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 ... :-"
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Position von String herausfinden

Beitrag von brandelh »

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.
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
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

Beitrag von ramses »

Es geht noch einfacher

Code: Alles auswählen

cText := memoread(...)
nZeile := 0 
if ( nStartPos := At(cSuchBegriff, cText) ) > 0 
  nZeile := numtoken( left(cText, nStartPos-1), chr(13) ) +1
endif
Gruss Carlo
Valar Morghulis

Gruss Carlo
Antworten