phil: Alle Datensätze ändern wo ein bestimtmes Zeichen vorkommt

Hallo.

Ich habe ca. 400 Datensätze.
Ich möchte, das überall wo im Datensatz ein "_" vorkommt, durch ein " " ersetzt wird. Das brauch ich da meine Suchmaschiene die Wörter sonst nicht findet.

Wie mache ich das am besten?
Ich muss doch theoretisch:
1.) Alle Datensätze auslesen.
2.) jeden durchsuchen nach einem "_"
3.) diese dann ersetzen durch ein " "
4.) Die Datensätze alle updaten.

Aber vorsicht. Nicht alle haben ein "_" im Datensatz.
Von ca 400, haben ca 320 ein oder mehrere "_" im Datensatz. Das soll geändert werden.

Danke im Vorraus.

mfg

Phil

  1. Hallo Phil,

    hast Du Deine Datensätze in einem Array? Wen nicht packe sie in eins, sollte beim einlesen auch das logischte sein. Dann kannst Du mit regullären Ausdrücken die Ersetzung vornehmen, sofern diese nötig ist.
    Dann:
    for ($i=0;$i<$datensaetze;$i++) {
        if (preg_mtach("/_/",$datensaetze[$i])) {
        // Der Unterstrich kommt vor, also ersetzten
            $datensaetze[$i] = preg_replace("/_/"," ",$datensaetze[$i]);
            // ersetzt Unterstrich durch Leerzeichen
        }
    }

    Greetz

    Sasha

    1. Hi

      for ($i=0;$i<$datensaetze;$i++) {
          if (preg_mtach("/_/",$datensaetze[$i])) {

      ^^
            if (preg_match("/_/",$datensaetze[$i])) {

      // Der Unterstrich kommt vor, also ersetzten
              $datensaetze[$i] = preg_replace("/_/"," ",$datensaetze[$i]);
              // ersetzt Unterstrich durch Leerzeichen
          }
      }

      mfg
      Genie

  2. Hallo Philipp,

    Ich habe ca. 400 Datensätze.

    das ist nicht besonders viel.

    Ich möchte, das überall wo im Datensatz ein "_" vorkommt, durch ein " " ersetzt wird. Das brauch ich da meine Suchmaschiene die Wörter sonst nicht findet.

    Das ist, wie ich finde, gar keine gute Idee. Du solltest meiner Meinung nach nicht die Daten ändern, die gespeichert wurden (es sei denn es sind eh' unwichtige und uninteressante Informationen, die ruhig verloren gehen können). Du solltest besser Deine Suchmaschine so anpassen, dass sie mit dem Unterstrich zurecht kommt.

    Wenn Du es dennoch machen willst, dann ist das folgende weder theoretisch noch praktisch der beste Weg.

    Wie mache ich das am besten?
    Ich muss doch theoretisch:
    1.) Alle Datensätze auslesen.

    Nein.

    2.) jeden durchsuchen nach einem "_"

    Nein.

    3.) diese dann ersetzen durch ein " "

    Nein.

    4.) Die Datensätze alle updaten.

    Nein.

    Nicht in der Reihenfolge - und auch nicht alles.

    Aber vorsicht. Nicht alle haben ein "_" im Datensatz.

    Ja, das haben wohl alle verstanden, Die Dein Posting gelesen haben.

    Von ca 400, haben ca 320 ein oder mehrere "_" im Datensatz. Das soll geändert werden.

    Du möchtest also die Datensätze ändern, die einen Unterstrich enthalten.
    Du möchtest den Unterstrich durch ein Leerzeichen ersetzen.

    Konsultiere die Dokumentation Deines Datenbankmanagementsystems (DBMS) nach den entsprechenden Zeichenkettenfunktionen, die es bereit stellt.

    Was Dein Problem mit PHP zu tun hat, will mir beim besten Willen nicht einleuchten. Du suchst doch eher eine SQL-Anweisung, die das erledigt, was Du vorhast.

    UPDATE tabelle  
    SET feld = neuer_wert(feld)      -- hier wende Stringfunktionen an.  
    WHERE (feld enthält Unterstrich) -- Nutze entsprechende Funktionen Deines DBMS
    

    Diese möchtest Du mit einem x-beliebigen Client Deines DBMS genau einmal ausführen. Du solltest in Zukunft darauf achten, keine Unterstriche mehr in der Datenbank abzuspeichern. Ok, da haben wir vermutlich die Verbindung zu PHP, da Deine Anwendung vermutlich in dieser Sprache geschrieben ist.

    Ich wiederhole jedoch erneut: Ich halte das nicht für eine gute Idee. Verbessere Deine Suchmaschine; das erscheint mir sinnvoller.

    Freundliche Grüße

    Vinzenz

    1. Ich wiederhole jedoch erneut: Ich halte das nicht für eine gute Idee. Verbessere Deine Suchmaschine; das erscheint mir sinnvoller.

      Hatte ich auch zuerst vor.

      Aber ich weiß beim besten Willen nicht wie!!!

      mfg

      Phil Z.

      1. Hallo Philipp,

        Ich wiederhole jedoch erneut: Ich halte das nicht für eine gute Idee. Verbessere Deine Suchmaschine; das erscheint mir sinnvoller.

        Hatte ich auch zuerst vor.
        Aber ich weiß beim besten Willen nicht wie!!!

        ohne Kenntnis Deines bisherigen Ansatzes kann man Dir dabei nicht weiterhelfen.
        Bitte erläutere Deinen bisherigen Ansatz - und woran Deine Lösung scheitert.

        @haxor, siehe https://forum.selfhtml.org/?t=144574&m=938075:

        a) hättest Du Dich gerne hier an dieser Diskussion beteiligen können.
           So hättest Du vermieden, doch einen neuen Thread aufzumachen :-)

        b) Könntest Du schreiben, welches Problem Du genau hast
           - Aktualisieren einer Menge von Datensätzen mit Zeichenkettenfunktionen
           - Nichtfinden von Daten mit Unterstrich

        Freundliche Grüße

        Vinzenz

        1. - Aktualisieren einer Menge von Datensätzen mit Zeichenkettenfunktionen

          Das ist eigendl. nur nebensache. Die Suchmaschiene anzupassen udn zu verbessern ist ein sinnvollerer Vorschlag. Danke!

          b) Könntest Du schreiben, welches Problem Du genau hast

          Ich will alle Einträge finden wo eine bestimmte Zeichenkette Der Suchbegriff) drin vorkommt.

          - Nichtfinden von Daten mit Unterstrich

          Hab schon überlegt als Ansatz:

          SELECT satz FROM tabelle WHERE spalte = STRINGFUNKTIONdurchsuchestring(SUCHBEGRIFF)

          So müsste praktisch alles gefunden werden egal ob sie nun getrennt sind oder nicht..

          Aber wie heißt diese Stringfunktion!? Bzw. gibt es so eine überhaupt. Hab schon im Referenzbuch nachgeguckt aber nicht das richtige gefunden.

          mfg

          Phil Z.

          1. Hallo,

            SELECT satz FROM tabelle WHERE spalte = STRINGFUNKTIONdurchsuchestring(SUCHBEGRIFF)

            Aber wie heißt diese Stringfunktion!? Bzw. gibt es so eine überhaupt. Hab schon im Referenzbuch nachgeguckt aber nicht das richtige gefunden.

            Einerseits gibt es immerhin in fast allen Datenbanksystemen, die mit SQL arbeiten, die LIKE-Klausel.

            Andererseits bieten Systeme wie z.B. mySQL String-Funktionen wie z.B. REPLACE() zum ersetzen von Teil-Strings, oder INSTR() zum finden fon Zeichenketten in strings an. Aber wie gesagt, das alles ist nur wirklich dann zu beantworten, wenn wir das verwendete Datenbanksystem kennen.

            Grüße
              Klaus

            1. Einerseits gibt es immerhin in fast allen Datenbanksystemen, die mit SQL arbeiten, die LIKE-Klausel.

              Die will ich aber nicht verwenden in dem Fall.

              Andererseits bieten Systeme wie z.B. mySQL String-Funktionen wie z.B. REPLACE() zum ersetzen von Teil-Strings, oder INSTR() zum finden fon Zeichenketten in strings an. Aber wie gesagt, das alles ist nur wirklich dann zu beantworten, wenn wir das verwendete Datenbanksystem kennen.

              Danke. Hab mir die Doku angeschaut. Ich werde aber nicht ganz klug daraus wie ich INSTR(str,substr) anwenden soll.

              Könnte ich
              SELECT satz FROM tabelle WHERE spalte = INSTR(SPALTE, suchbegriff)

              machen oder wie? was soll als str also als string angegeben werden.

              Und was REPLACE() angeht...

              SELECT WHERE
              INSTR(SPALTE, "_" )
              REPLACE(spalte,"_"," ")

              Hmm so scheint es nicht ganz richtig zu sein oder?

              Bitte um schnelle Hilfe.
              Danke im Vorraus.

              Phil

              1. hi,

                das dir keiner Antwortet liegt wahrscheinlich an deiner mangelnden Bereitschaft dich mit der Materie auseinander zu setzen...aber die Lösung ist so banal, das ich sie dir gerne kundtue:

                SELECT WHERE
                INSTR(SPALTE, "_" )
                REPLACE(spalte,"_"," ")

                öhm - knapp daneben ;-)

                  
                update tabellenname  
                set spalte = replace(spalte,"_"," ")  
                
                

                viel spass noch und bevor ichs vergesse - selbstverständlich bin ich auch der Meinung das du die Suchfunktion anpassen solltest. Das Ersetzen des "_" beim Einfügen halte ich auch nicht für klug...(wenn den jemand eingibt wir er doch einen Grund dafür haben oder?)...und auch nicht für notwendig!

                Gruss,
                Seppel

                1. Hi.

                  das dir keiner Antwortet liegt wahrscheinlich an deiner mangelnden Bereitschaft dich mit der Materie auseinander zu setzen...aber die Lösung ist so banal, das ich sie dir gerne kundtue:

                  Doch das hab ich aber ich checks nicht wie ich die Suchmaschiene ändern muss.

                  update tabellenname
                  set spalte = replace(spalte,"_"," ")

                    
                  Super danke. Geht auch irgendiwe folgendes?:  
                  Über all wo  
                  wort-wort  
                  steht soll nun  
                  wort - wort stehn  
                  also das vor und nach einem "-" immer in leerzeichen stehn muss?  
                    
                  
                  > viel spass noch und bevor ichs vergesse - selbstverständlich bin ich auch der Meinung das du die Suchfunktion anpassen solltest.  
                    
                  das will ich auch aber ich weiß immer noch nicht wie.  
                    
                    
                  Grüße.  
                    
                  Phil Z.  
                    
                  PS:@haxor lass mal gut sein anscheinend hast du bisher nicht viel mit dem Forum zu tun sonst würdest du nicht so posten. (musste ich auch erstmal lernen am Anfang) obwohl ich dir Recht gebe. Ich habe lange darauf gewartet das jmd. weiterhilft..
                  
                  1. replace("hi","dOh")

                    Doch das hab ich aber ich checks nicht wie ich die Suchmaschiene ändern muss.

                    Lüga ;-)

                    1. wenn du dich damit beschäftigt hättest würdest du (vorallem nachdem Vince die Überschrift in UPDATE geändert hat) wissen, das man Daten nicht mit select ändert...

                    2. poste doch einfach mal deine Suchfunktion

                    3. oje, keine Ahnung...aber NEIN - du hast dich und wirst dich anscheinend mit SQL oder ähnlichem nicht auseinander setzen...sonst könntest du ggf. hierraus

                    update tabellenname
                    set spalte = replace(spalte,"_"," ")

                      
                    das hier ableiten  
                      
                    ~~~sql
                      
                    update tabellenname  
                    set spalte = replace(spalte,"-"," - ")  
                    
                    

                    fairer weise sollte man an dieser Stelle erwähnen, dass es dem Update-Befehl in diesem Moment egal ist ob ein Wort/eine Zahl oder sonst was vor und hinter dem Bindestrich steht...also "do what you want, but think about the omen"

                    4. wenn du gleich wissen willst wie man ";" durch ein "," ersetzt werde ich nicht mehr antworten ;-)

                    Super danke.

                    Gerne...aber das hättest du alles auch selbst rausfinden können.

                    PS:@haxor lass mal gut sein anscheinend hast du bisher nicht viel mit dem Forum zu tun sonst würdest du nicht so posten. (musste ich auch erstmal lernen am Anfang) obwohl ich dir Recht gebe. Ich habe lange darauf gewartet das jmd. weiterhilft..

                    führst du hier Selbstgespräche oder gibt es wirklich jemanden der auch von böswilligen Sonderzeichen heimgesucht wird *fg*

                    Seppel

                      1. wenn du dich damit beschäftigt hättest würdest du (vorallem nachdem Vince die Überschrift in UPDATE geändert hat) wissen, das man Daten nicht mit select ändert...

                      2. poste doch einfach mal deine Suchfunktion

                      Habe ich bereits. Mache ich aber gerne nochmal.

                      1. oje, keine Ahnung...aber NEIN - du hast dich und wirst dich anscheinend mit SQL oder ähnlichem nicht auseinander setzen...sonst könntest du ggf. hierraus
                        fairer weise sollte man an dieser Stelle erwähnen, dass es dem Update-Befehl in diesem Moment egal ist ob ein Wort/eine Zahl oder sonst was vor und hinter dem Bindestrich steht...also "do what you want, but think about the omen"

                      und genau das war der punkt mir war schon klar das ich das so machen könnte ich will aber das
                      "wort - wort"
                      so bleibtnur
                      "wort-wor"
                      soll sich ändern in
                      "wort - wort"

                      1. wenn du gleich wissen willst wie man ";" durch ein "," ersetzt werde ich nicht mehr antworten ;-)

                      Brauchst ud nciht.

                      führst du hier Selbstgespräche oder gibt es wirklich jemanden der auch von böswilligen Sonderzeichen heimgesucht wird *fg*

                      Wer Haxor ist weiß ich nicht. Ich kenn den Menschen nicht.

                      Hier meien bisherige Suchfunktion:
                      ------------------------------------

                      <?php  
                         if(isset($_POST['Search'])){  
                          include("sql.php");  
                          $searcht=$_POST['searcht'];  
                          $searcht = ltrim($searcht);  
                          $searcht = rtrim($searcht);  
                          $u="SELECT * FROM ddl_album WHERE MATCH (name) AGAINST ('$searcht' WITH QUERY EXPANSION)";  
                          $result=mysql_query($u) or die(mysql_error());  
                          if(mysql_num_rows($result)) {  
                           while($row = mysql_fetch_assoc($result)){  
                            $row['name'];  
                            $row['adresse'];  
                            $row['pw'];  
                        
                            echo "  
                            <tr><td class='link'>  
                            <a href='".$row['adresse']."' target='_blank'>"  
                            .$row['name']."</td><td class='pw'>".$row['pw']."</td></tr>";  
                           }  
                          }  
                        
                         }  
                        ?>
                      

                      Danke..

                      Phil

                      1. Hey.

                        Könnte mir bitte noch jemand weiterhelfen?!

                        Danke.

                        mfg

                        Phil

                        1. Hey.

                          Könnte mir bitte noch jemand weiterhelfen?!

                          Danke.

                          mfg

                          Phil

                          dito! :(

                      2. Hallo Philipp,

                        wie wäre es mit ein paar Beispieldaten zu Deinem Statement?

                        SELECT * FROM ddl_album WHERE MATCH (name) AGAINST ('$searcht' WITH QUERY EXPANSION

                        - ein paar Beispieldatensätze
                         - ein oder zwei Sucheingaben
                         - das von Dir gewünschte Ergebnis
                           (mit Begründung, warum dies das gewünschte Ergebnis ist)
                         - das Dir gelieferte Ergebnis

                        Freundliche Grüße

                        Vinzenz

                        1. Hallo Vinzenz,

                          SELECT * FROM tabekke WHERE MATCH (name) AGAINST ('$searcht' WITH QUERY EXPANSION

                          • ein paar Beispieldatensätze

                          ID NAME
                          0 das wetter ist schön
                          1 das_wetterPODist der!=doofe
                          2 das-WetTer
                          3 der iPod zickt rumm
                          4 Wettermeister auf Tour

                          • ein oder zwei Sucheingaben

                          Eingaben:
                          1. das
                          2. das wetter
                          3. wetter
                          4. der

                          • das von Dir gewünschte Ergebnis
                               (mit Begründung, warum dies das gewünschte Ergebnis ist)

                          zu 1.: Name von ID: 0,1,2
                          zu 2.: Name von ID: 0,1,2
                          zu 3.: Name von ID: 0,1,2,4
                          zu 4.: Name von ID: 1,3

                          Überall wo die Zeichenkette eines Datensatzes, eines der in der Suche eingegebenen Wörter beinhaltet, wurde der Name der ID ausgegeben.

                          • das Dir gelieferte Ergebnis

                          zu 1.: Name von ID: 0
                          zu 2.: Name von ID: 0
                          zu 3.: Name von ID: 0
                          zu 4.: Name von ID: 3

                          Ich hoffe das ist verständlich genug.
                          Danke für die weitere Hilfe.

                          Mit freundlichen Grüßen

                          Phil Z.

                          1. Hallo Philipp,

                            SELECT * FROM tabekke WHERE MATCH (name) AGAINST ('$searcht' WITH QUERY EXPANSION

                            Du solltest Dir das relevante Handbuchkapitel durchlesen.

                            - Stopwörter
                             - Mindestlänge (hast Du offensichtlich getunt)
                             - Relevanz
                             - warum WITH QUERY EXPANSION?

                            • ein oder zwei Sucheingaben
                              Eingaben:
                            1. das          -- schlechtes Suchwort, Effekt ist beschrieben
                            2. das wetter   -- was macht "WITH QUERY EXPANSION"?
                            3. wetter       -- tja, das ist beschrieben
                            4. der          -- Glückssache

                            Hmm, meine Lieblingsfrage habe ich bisher ganz vergessen:
                            Welche MySQL-Version ist im Einsatz?

                            Freundliche Grüße

                            Vinzenz, der trotz vieler Drängelpostings die Hoffnung noch nicht aufgibt.

                            1. Hallo Vinzenz,

                              Du solltest Dir das relevante Handbuchkapitel durchlesen.

                              Hab ich bereits, mach ich aber trotzdem noch ein paar mal.

                              • Stopwörter
                              • Mindestlänge (hast Du offensichtlich getunt)
                              • Relevanz
                              • warum WITH QUERY EXPANSION?

                              Mehr Ergebnisse die ähnlich sind.

                              Hmm, meine Lieblingsfrage habe ich bisher ganz vergessen:
                              Welche MySQL-Version ist im Einsatz?

                              MySQL 5.0.27

                              Freundliche Grüße

                              dito!

                              Vinzenz, der trotz vieler Drängelpostings die Hoffnung noch nicht aufgibt.

                              Danke das du mir noch hilfst.

                              mfg

                              Phil

                              1. Hi,
                                also was ich vllt. als erstes machen sollte wäre die Boolsche Suche verwenden und Die Quelldistribution installieren, damit ich die Werte ft_min_word_len und ft_max_word_len ändern kann.
                                Allerdings ist das nicht möglich da ich einen Freehoster benutze die sowas bzw solchen Support/Update/Upgrade nicht unterstützen.

                                Aber ich bleib auch immer noch an der Stelle hengen: Welche stringfunktion ich da einbauen soll.

                                mfg

                                Phil Z.

                                1. Bekomm ich hier noch Hilfe oder wie sieht das aus?

                                  Bitte.. Ich warte seit Tagen.

                                  mfg

                                  Phil Z.

                                2. Hallo Philipp,

                                  also was ich vllt. als erstes machen sollte wäre die Boolsche Suche verwenden

                                  ja, das wäre schon mal eine Idee :-)

                                  und Die Quelldistribution installieren, damit ich die Werte ft_min_word_len und ft_max_word_len ändern kann.
                                  Allerdings ist das nicht möglich da ich einen Freehoster benutze die sowas bzw solchen Support/Update/Upgrade nicht unterstützen.

                                  was bedeutet, dass Du diese Werte nicht einstellen kannst und mit den gegebenen Beschränkungen der Volltextsuche leben mußt. Hast Du verstanden, warum es diese Beschränkungen gibt?

                                  Freundliche Grüße

                                  Vinzenz

                                  1. Hi,

                                    ja, das wäre schon mal eine Idee :-)

                                    okay, dann werde ich das tun.

                                    was bedeutet, dass Du diese Werte nicht einstellen kannst und mit den gegebenen Beschränkungen der Volltextsuche leben mußt. Hast Du verstanden, warum es diese Beschränkungen gibt?

                                    Ja ich denke schon.

                                    Wie kann ich denn jetzt "machen" das man auch sowas wie

                                    _wetter_12s

                                    findet bei der eingabe von "wetter"?

                                    mfg

                                    Phil Z.

                                    1. Hi nochmal ;-)

                                      hast deine Frage ja immernoch offen...

                                      Wie kann ich denn jetzt "machen" das man auch sowas wie
                                      _wetter_12s
                                      findet bei der eingabe von "wetter"?

                                      mal die anderen Postings aussen vor gelassen könntest du das doch einfach mit: "select * from T where S like '%wetter%'" finden.

                                      Ansonsten zu deinem Bsp von oben:
                                      das_wetter
                                      das wetter
                                      das-wetter

                                      alle findest du mit "das wetter", wenn du das Suchwort aufteilst. Soll heissen z.B. so (Befehle musst du dir natürlich in deiner Progsprache besorgen und umschreiben):

                                      myArray = Split(Suchwort," ")  
                                      For i=0 To Ubound(myArray)  
                                         myRestriction = myRestriction & " and S like '%" & myArray(i) & "'"  
                                      Next  
                                      mySQL = "select * from T where 1=1" & myRestriction  
                                      
                                      

                                      Sollte doch ohne Probleme alles finden oder?

                                      Gruss,
                                      Seppel

            2. Na klar hab ich auch schon geschrieben! Es ist MySQL.
              Nur wie wende ich die Stringfunktion richtig an?

              mfg

              Phil

        2. Sorry.

          Aber hier postet schon wieder keiner.+

          mfg
          Haxor

          1. hehe,

            grade erst deinen Hilfe-Schrei von heute gesehen...wirst du von heimtückischen Unterstrichen angegriffen, die nebst unverschämter Blockade "eurer" Suchmaschinen auch noch die Existenz "eurer" Tabellen und Leben bedroht?

            lustig ;-)

            Gruss,
            Seppel