Peter: Trennzeichen zum Inhalte in Textdateien abzuspeichern

Hallo,

wollte euch mal fragen was eigentlich so die beste Methode ist, um mehrere Werte die in einer Textdatei abgespeichert werden zu trennen.

Hatte bissher "|" als Trennzeichen. Wenn ich nun aber einen Text bzw. eine Url eingebe die dieses Zeichen enthält und danach in der txt abgespeichert wird, funktioniert die auslesung der Zeichen nicht mehr richtig. Da man nicht mehr unterscheiden kann was wo hin gehört.

Also um es auf den Punkt zu bringen, gibt es ein besseres Trennzeichen als "|" ?

tschö

Peter

  1. Hi,

    wollte euch mal fragen was eigentlich so die beste Methode ist, um mehrere Werte die in einer Textdatei abgespeichert werden zu trennen.

    ein Zeichen zu verwenden, welches nirgendwo sonst vorkommt.

    Die zweitbeste Methode ist, irgendein Zeichen zu nehmen, und dieses bei jedem Vorkommen im Text zu verändern (kodieren, escapen...), mit allen Vor- und Nachteilen (z.B. dass Du auch das Escapezeichen kodieren musst und dass split() nicht mehr pauschal klappt).

    Die allerbeste Methode ist, eine Datenbank anstelle von Dateien zu verwenden.

    Hatte bissher "|" als Trennzeichen.

    Was hälst Du von "\t"? Das kommt in URLs eher selten vor.

    Beachte: Wenn Du das Trennzeichen in allen(!) Texten nicht *garantiert* ausschließen kannst (und ja, auch der Tabulator kann in ein Eingabefeld eingegeben werden), *musst* Du die zweitbeste Methode verwenden.

    Also um es auf den Punkt zu bringen, gibt es ein besseres Trennzeichen als "|" ?

    Ja: den Spaltentrenner einer Datenbank.

    Cheatah

  2. Warum eigentlich kein ;

    Hallo,

    wollte euch mal fragen was eigentlich so die beste Methode ist, um mehrere Werte die in einer Textdatei abgespeichert werden zu trennen.

    Hatte bissher "|" als Trennzeichen. Wenn ich nun aber einen Text bzw. eine Url eingebe die dieses Zeichen enthält und danach in der txt abgespeichert wird, funktioniert die auslesung der Zeichen nicht mehr richtig. Da man nicht mehr unterscheiden kann was wo hin gehört.

    Also um es auf den Punkt zu bringen, gibt es ein besseres Trennzeichen als "|" ?

    tschö

    Peter

    1. Hi,

      Warum eigentlich kein ;

      weil das im Gegensatz zum "|" sogar vorkommen darf[1], und vom W3C sogar (wegen der Kollision des "&" mit HTML-Entitäten) als Trennzeichen empfohlen wird.

      Cheatah

      [1] Laut RFC 1738 (http://www.ietf.org/rfc/rfc1738.txt) ist "|" unter "national" eingeordnet, welches soweit ich es überblicke in keinem Protokoll eingesetzt werden darf.

      1. WOW!!!! Was man alles wissen kann :-)

        Hi,

        Warum eigentlich kein ;

        weil das im Gegensatz zum "|" sogar vorkommen darf[1], und vom W3C sogar (wegen der Kollision des "&" mit HTML-Entitäten) als Trennzeichen empfohlen wird.

        Cheatah

        [1] Laut RFC 1738 (http://www.ietf.org/rfc/rfc1738.txt) ist "|" unter "national" eingeordnet, welches soweit ich es überblicke in keinem Protokoll eingesetzt werden darf.

        1. Hallo Ulrich,

          Ich weiss, es nervt, aber trotzdem gibt's überall Konventionen, an die man sich besser halten sollte, so auch hier:

          </faq/>

          Daraus insbesondere:

          </faq/#Q-04>
          </faq/#Q-05a>
          </faq/#Q-05c>
          </faq/#Q-05d>
          </faq/#Q-09a>

          Bitte, sei so nett, halt' dich dran - bevor hier einer kommt und dir richtig einen "auf die Rübe zimmert". ;o)

          Danke.

          File Griese,

          Stonie

        2. Hi,

          WOW!!!! Was man alles wissen kann :-)

          es ist eigentlich nicht wichtig, alles zu wissen. Es ist wichtig zu wissen,

          • was man alles wissen kann, und
          • wo man dieses Wissen findet.

          Dass "|" nicht erlaubt ist hatte ich beispielsweise nur geahnt, und dann eben an richtiger Stelle nachgelesen.

          Cheatah

  3. Moin auch!

    wollte euch mal fragen was eigentlich so die beste Methode ist, um mehrere Werte die in einer Textdatei abgespeichert werden zu trennen.

    Wenn ich nicht mit absoluter Sicherheit das Vorkommen eines bestimmtes Zeichens in den zu speichernden Texten ausschliessen kann (und genau das ist ja Dein Problem), gehe ich gewoehnlich folgenden Weg:

    * Auswaehlen eines schoenen griffigen Trennzeichens. | und ; sind gute Kandidaten, prinzipiell ist aber auch ein grosses A oder kleines m moeglich (wie Du gleich sehen wirst). Ich gehe im folgenden mal von | als Beispiel aus.

    * Entwerfe ein Codierungsschema. Was sich da anbietet, ist vielleicht ein bisschen sprachabhaengig. Ich gehe jetzt mal von Perl aus, wo man eine eingelesene Zeile am besten mit split() in die Felder zerlegt. An dieser Stelle funktioniert eine einfache Maskierung mit \ *nicht*, weil split an einem | immer noch splitten wuerde, es sei denn, man schliesst einen \ vor dem | per regexp aus. Das geht zwar, aber die naechste Ausnahme folgt auf dem Fuss: Bei \| ist der zweite \ geschuetzt, das | stellt tatsaechlich einen Feldtrenner dar, sodass hier doch gesplittet werden soll. Man sieht leicht, dass man das ewig so fortsetzen kann.

    Daher waehlt man eine Kodierung, die das zu kodierende Zeichen selbst nicht mehr enthaelt. Ich tendiere da zur Verwendung des hexadezimalen ASCII-Codes des Zeichens, nagefuehrt von einem Markierungszeichen. Das Markierungszeichen selbst muss dann (bzw. vorher) natuerlich auch codiert werden, sonst wuerde man beim spaeteren Decodieren ja an den falschen Stellen arbeiten, wenn im Text bereits dieses Zeichen vorkommt. Waehlen wir also von mir aus wieder den \ als Einleitungszeichen der Codierung, schreiben aber diesmal den hex ascii code des zu codierenden Zeichens dahinter. Der ist 5C fuer den Backslash selbst, und 7C fuer das Pipe-Zeichen.

    Man codiert also: Zuerst(!!) den Backslash:
        s/\/\5C/g;
      dann das Pipe-Zeichen:
        s/|/\7C/g;
      (geht in Perl natuerlich auch schoener in einem Rutsch)

    Hier jetzt die Felder mit | zusammenfuegen und in Datei schreiben.

    Spaeter dann Datei auslesen und Felder am | splitten. Dann einzelne Felder decodieren, und zwar in genau der umgekehrten Reihenfolge wie bei der Codierung. Auf keinen Fall zuerst den Backslash decodieren, weil der ja dann im naechsten Durchlauf wieder eine Codierung an der falschen Stelle anzeigen wuerde. Aber in Perl kann man auch einfach
        s/\([0-9A-Fa-f]{2})/chr(hex($1))/eg;       # aus dem Kopf, ungetestet
      schreiben, das arbeitet von vorn nach hinten durch, sodass keine Doppel-Decodierung auftritt (hier zeigt sich, warum die Verwendung des ASCII-Codes Sinn macht).

    Soweit zum Prinzip. Ich persoenlich benutze lieber folgende Variante:
      Codierung:
        s/([%|\x00-\x1F])/'%'.ord($1).';'/ge;       # codiert auch Steuerzeichen (incl. Zeilenumbrueche)
      Decodierung:
        s/%(\d+);/chr($1)/ge;
      Das hat keine zwingenden Gruende, sieht nur schoener aus und ist einfacher, als jedes Zeichen einzeln zu codieren.

    Nicht beruecksichtigt wurden hier irgendwelche Zeichensatzprobleme (die Zeichencodes ueber 128 varriieren zwischen den Zeichensaetzen). Das macht aber nichts, solange Du nur beim Decodieren denselben Zeichensatz zurueckerwartest, den Du beim Codieren verwendet hast, was gewoehnlich der Fall ist.

    HTH && So long

    --
    Scientists say there are over 3,000 spiders for every human being on earth. Does anybody want mine? I certainly don't.
        -- Chuck Bonner