WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Funktion, die String findet

 

jens.ru
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 29.08.2022, 10:36     Titel: Funktion, die String findet
  Antworten mit Zitat      
Ich durchsuche eine Liste von Strings nach einem gewissen Muster.

aktuell löse ich das über find(contains()), habe hierbei aber das Problem, dass auch Strings gefunden werden, die den String beinhalten, danach aber noch weitergehen. Ich habe es mittels strcmp versucht, habe hier aber das Problem, dass manche Strings noch einen Fußnotenverweis enthalten, die über diese Lösung natürlich ignoriert werden.

Praktisches Beispiel...ich habe als Suchobjekt "text" und möchte, dass gefunden wird:
"text"
"text 1)"

aber nicht "textabc"

Meine Idee war nun eine und-Verkettung von find(contains("text")&&contains("1)")), aber das habe ich bisher nicht lauffähig hinbekommen.

Gibt´s hier irgendeinen Ansatz?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.453
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.08.2022, 12:09     Titel:
  Antworten mit Zitat      
Hallo,

bei so etwas ist aus meiner Sicht wichtig, dass ganz genau klar ist, was gefunden werden soll und was nicht, insbesondere hier: was darf das Zeichen / die Zeichen vor und nach Text sein und was nicht? Vermutlich soll "text 2)" auch gefunden werden, "textdef" aber nicht. Wie sieht es mit "text1)" oder "text abc" aus?
Vermutlich wäre ein ausführlicheres Beispiel, das näher an deiner Anwendung ist, hilfreich.

Ein Ansatz:
Code:
txt = ["abc text def", "abc text", "ghi text 1) jkl", "abc textabc def"]
endsWith(txt, "text") | contains(txt, "text ")

Falls wichtig ist, dass Zahlen oder Buchstaben folgen, können Funktionen wie digitsPattern oder lettersPattern hilfreich sein.

Wenn der Vorschlag nicht funktioniert, bitte ein konkretes Beispiel dafür und was darin gefunden werden soll (und was nicht).

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 29.08.2022, 12:24     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die schnelle Antwort.

Die Strings kommen alle aus einer Excel Spalte, die ich zuerst in ein xx * yy String Array überführe, hiervon beachte ich nur eine Spalte.

Grundsätzlich gilt, dass die gesuchten Strings kein Leerzeichen beinhalten dürfen. Vor dem String kommt nichts, danach idR auch nichts mehr, außer eben Fußnoten 1) - 7), oder ein Stern. Bis auf wenige Ausnahmen sind die Strings auch alle eindeutig und nur einmal in der Liste vorhanden. Wenn ich nach "text" suche, möchte ich weder "abctext", "textabc", "textdef", "detextf", sondern wirklich nur den String "text", wobei "text" von (theoretisch) beliebigen Strings gefolgt sein darf, wobei hier immer (mindestens) ein Leerzeichen vorhanden ist.

Ich hoffe, es wird nun ein bisschen klarer?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.453
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.08.2022, 12:46     Titel:
  Antworten mit Zitat      
Hallo,

und, funktioniert der Vorschlag bzw. kannst du ihn so anpassen, dass er funktioniert? Wie gesagt:
Zitat:
Wenn der Vorschlag nicht funktioniert, bitte ein konkretes Beispiel dafür.


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 29.08.2022, 13:08     Titel:
  Antworten mit Zitat      
Huch, den zweiten Teil deines Beitrages hatte ich irgendwie ignoriert. Sorry.

Nein, der Vorschlag funktioniert so nicht/nur bedingt.
Vielleicht muss ich noch ein bisschen detaillierter formulieren, was ich will (oder ganz einfach formulieren?)

Ich will letztlich nur eine Abfrage: Enthält ein String NUR ein pattern "text" ODER ein pattern "anderertext " UND zusätzlich noch eine gewisse footnote. Es darf pro Abfrage nur der wirklich betroffene String gefunden werden.

Ich habe zB

"abc"
"abcdef"
"ghi 1)"
"hij 1)"
"jkl 2)"
"klm 2)"

bei deinem Vorschlag endswith | contains wird mir "abc" zurück gegeben, aber auch alle, die eine Footnote beinhalten. Eine Veroderung dürfte hier nicht zielführend sein...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.453
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.08.2022, 13:44     Titel:
  Antworten mit Zitat      
Hallo,

und was soll in dem Beispiel nun gefunden werden und was nicht?
Was meinst du mit "nur der wirklich betroffende String"? Dass der gefundene Teil extrahiert werden soll anstatt den kompletten String zurückzugeben?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 29.08.2022, 14:15     Titel:
  Antworten mit Zitat      
Sorry, vermutlich drücke ich mich einfach komplizierter aus, als es sein müsste...

Ich versuche es noch einmal mit einem ganz praktischen Beispiel. Ich habe in meiner Liste zB stehen:

Fluss
Flussbett
Donau 1)
Main 1)
Regnitz 1)
Strand 2)
Stein 2)
Kies 2)

und dazu noch ein Array footnotes = ["1)" "2)" ... "7)"]

Nun suche ich anhand einer externen List in meinem Stringarray nach "Fluss" und möchte wirklich nur die Zeile zurück gegeben haben, in der "Fluss" steht. Das funktioniert normal über find(strcmp()). Nun komme ich im nächsten Suchdurchlauf und möchte "Main" finden. Das funktioniert über strcmp nicht, würde über find(contains()) funktionieren, weil noch die Fußnote dort ist. Nutze ich aber contains im "Fluss"-Fall, bekomme ich auch Flussbett zurück, obwohl ich das nicht will.

Darum bin ich gerade auf der Suche nach irgendwie einer Kombination oder einer Alternative, bei der ich dann sagen kann:
strcmp(alternativ endswith)(dataSet(:,column),expression) || contains(dataSet(:,column),expression)&&footnote
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.453
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.08.2022, 15:23     Titel:
  Antworten mit Zitat      
Hallo,

bitte hebe doch bei deinen Beispielen z.B. durch Fettdruck hervor, was gefunden werden soll. Das ist viel einfacher als länglichen Text zu lesen.

Vorschläge aktuell:
Code:
find(data == "Fluss" | startsWith(data, "Main"))
find(data == "Fluss" | contains(data, "Main"))

Was nun die Fußnoten sind, scheint hier ja recht egal zu sein?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 30.08.2022, 06:28     Titel:
  Antworten mit Zitat      
Guten Morgen Harald,

besten Dank für deine Tatkräftige Unterstützung.

Gefunden werden soll der Inhalt der Variable currentStringToCheck, der bei jeder Iteration neu vergeben wird. Zurückgegeben werden soll die Position des Fundes. Im Falle des bisherigen Beispiels:

Fluss
Flussbett
Donau 1)
Main 1)
Regnitz 1)
Strand 2)
Stein 2)
Kies 2)

currentStringToCheck = "Fluss" -> gefunden: Fluss -> Rückgabe: 1
currentStringToCheck = "Flussbett" -> gefunden: Flussbett, -> Rückgabe: 2
currentStringToCheck = "Strand" -> gefunden: Strand 2) -> Rückgabe: 6
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.453
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.08.2022, 09:14     Titel:
  Antworten mit Zitat      
Hallo,

du meintest doch zuvor, dass du Flussbett nicht willst? Auch wolltest du Main und nicht Strand?

Mein Eindruck ist, dass die Antwort für mich nicht schwer zu finden ist, wenn ich die Frage einmal verstanden habe. Mein Verständnis war, dass aus dem folgenden Beispiel die fett hervorgehobenen Teile gefunden werden sollen und der Rest nicht.

Fluss
Flussbett
Donau 1)
Main 1)
Regnitz 1)
Strand 2)
Stein 2)
Kies 2)

Mein Vorschlag sollte das liefern.

Falls ich die Frage falsch verstanden habe oder der Vorschlag in anderen Fällen doch nicht funktioniert, bitte die Problematik so erklären, dass ich sie auch verstehe. ;) Ansonsten kommen wir hier leider nicht weiter.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 30.08.2022, 10:33     Titel:
  Antworten mit Zitat      
Na, solange du noch ein kleines bisschen Geduld mit mir hast, kommen wir irgendwann sicher zu dem Punkt des vollen Verständnisses Wink Auch wenn meine Kurzschreibweise jetzt leider wenig gebracht hat Smile Daher nochmal (viel) Fließtext, sorry!

Genau das ist mein Problem, dass das ganze recht dynamisch sein soll.
Es soll "nichts vorhersehbares" gefunden werden, sondern etwas, das im Programmablauf dynamisch eingelesen wird und mit jedem Programmstart andere Quellen haben kann. Irgendwie gar nicht so einfach zu erklären.

Wenn (und nur WENN) meine Variable zum Abgleich mit Fluss initialisiert wird, dann will ich Fluss finden und nicht Flussbett. WENN die Variable mit Flussbett initialisiert wird, dann will ich Flussbett finden. Wenn meine Variable mit Fluss initialisiert wird, dann will ich Fluss finden, (was auch als Fluss 1) vorhanden sein kann), aber auf keinen Fall Flussbett.

Vielleicht dient es dem Verständnis, wenn ich noch kurz dazu schreibe, was vorher passiert...
Ich habe ein .txt file und ein .xls file. im .xls File stehen etwa 1000 Begriffe (mit oder ohne Fußnote und stellenweise eben auch Fluss und Flussbett oder vielleicht auch Greifvogel oder Portwein, das weiß ich eben nicht). Im .txt File stehen etwa 300 Begriffe (eine Auswahl aus den 1000) und ich will die .txt Datei mit dem .xls File abgleichen und daher muss ich den Begriff, der im .txt File steht zuverlässig im .xls File finden. Wenn nun im .txt File "Fluss" auftaucht, dann muss ich im .xls File zuverlässig auch Fluss finden können. Genauso wie eben zB Fluss 1), Fluss 2) oder Fluss 7), aber eben NICHT...AUF GAR KEINEN FALL Flussbett. Smile

Ich hoffe, nun Licht ins Dunkle gebracht zu haben?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.453
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.08.2022, 14:13     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Genau das ist mein Problem, dass das ganze recht dynamisch sein soll.
Es soll "nichts vorhersehbares" gefunden werden, sondern etwas, das im Programmablauf dynamisch eingelesen wird und mit jedem Programmstart andere Quellen haben kann.

Das verstehe ich. Um diesen allgemeingültigen Ansatz zu entwickeln, bleibt aber meiner Meinung nach nichts anderes übrig als sich konkrete Beispiele anzusehen. Wenn ein Vorschlag in dem momentanen Beispiel oder auch in einem anderen Beispiel nicht die gewünschten Ergebnisse liefert, dann ist es wichtig genau zu verstehen:
* was ist die konkrete Ausgangslage (hier kann z.B. sogar wichtig sein, ob die Daten als Cell Array von char oder als String vorliegen)
* welche Ergebnisse möchtest du haben (z.B. durch Fettdruck hervorheben)
* falls nicht offensichtlich: wie weichen die momentanen Ergebnisse von den gewünschten ab?

Neuer Vorschlag, der testet, ob jedes Element
a) genau das Suchwort ist
b) mit dem Suchwort, gefolgt von einem Leerzeichen, beginnt
c) mit dem Suchwort, vorangegangen von einem Leerzeichen, endet
d) das Suchwort in Leerzeichen eingebettet enthält

Code:
data = ["Fluss"
"Flussbett"
"Donau 1)"
"Main 1)"
"Regnitz 1)"
"Strand 2)"
"Stein 2)"
"Kies 2)"]

searchTerm = "Fluss";
find(data == searchTerm | startsWith(data, searchTerm+" ") | endsWith(data, " "+searchTerm) | contains(data, " "+searchTerm+" "))


Wenn es hier nun Probleme gibt, bitte nicht von vorne mit einer neuen Erklärung anfangen, sondern ganz konkret an diesem oder einem anderen Beispiel aufzeigen, was fälschlich gefunden oder nicht gefunden wird.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
jens.ru
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 19.11.13
Wohnort: Baunach
Version: R2022a
     Beitrag Verfasst am: 06.09.2022, 09:14     Titel:
  Antworten mit Zitat      
Hallo Harald,

entschuldige die späte Rückmeldung. Aber nach den ersten Versuchen scheint dieser Ansatz nun genau das richtige Resultat zu liefern.

Tausend Dank dir mal wieder!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum 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.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.