Aus Codierungsgründen, die Sie entsetzen würden (es ist mir zu peinlich zu sagen), muss ich eine Reihe von Textelementen in einer einzigen Zeichenfolge speichern.
Ich werde sie mit einem Zeichen abgrenzen.
Welches Zeichen ist dafür am besten geeignet, dh welches Zeichen erscheint am seltensten im Text? Muss druckbar sein und wahrscheinlich weniger als 128 in ASCII, um Probleme mit dem Gebietsschema zu vermeiden.
ascii
delimiter
delimited-text
Rahul
quelle
quelle
|
in ihrem Text haben könnten , hatte ich tatsächlich einen solchen Fall, in dem ich die Zeichen so gering wie möglich halten musste. Da die meisten Felder Zeichenfolgen mit interessantem Text enthielten, funktionierte CSV nicht, da viel entkommen war. Unser Feldbegrenzer ist/|
. Der Schrägstrich ist nur mäßig häufig, aber gepaart mit einem Rohr, auf das Sie nie stoßen. Ich habe eine Engine verwendet, durch die jeden Tag viele Daten übertragen werden. Dies ist nie kaputt gegangen, und ich musste nie eine einzelne Zeichenfolge einkapseln oder einem speziellen Zeichen entkommen. Im Durchschnitt haben wir durch diesen Mechanismus einige Prozent Text eingespart.Antworten:
Angenommen, Sie können CSV aus irgendeinem peinlichen Grund nicht verwenden, würde ich sagen, gehen Sie mit den Daten. Nehmen Sie einige Beispieldaten und führen Sie für jeden Wert 0-127 eine einfache Zeichenanzahl durch. Wählen Sie eine der nicht vorkommenden. Wenn Sie zu viel Auswahl haben, erhalten Sie einen größeren Datensatz. Das Schreiben dauert nicht lange und Sie erhalten die beste Antwort für Sie.
Die Antwort ist für verschiedene Problembereiche unterschiedlich, also | (Pipe) ist in Shell-Skripten üblich, ^ ist in mathematischen Formeln üblich, und das gleiche gilt wahrscheinlich für die meisten anderen Zeichen.
Ich persönlich denke, ich würde mich für | entscheiden (Pipe) Wenn Sie die Wahl haben, aber mit echten Daten arbeiten, ist dies am sichersten.
Und was auch immer Sie tun, stellen Sie sicher, dass Sie ein Fluchtschema ausgearbeitet haben!
quelle
additional_attributes
.\t
als Trennzeichen?Ich würde "Unit Separator" ASCII-Code "US" wählen: ASCII 31 (0x1F)
In den alten, alten Tagen wurden die meisten Dinge seriell ohne zufälligen Zugriff erledigt. Dies bedeutete, dass einige Steuercodes in ASCII eingebettet waren.
Unit Separator ist in ASCII und es gibt Unicode-Unterstützung für die Anzeige (normalerweise ein "us" in derselben Glyphe), aber viele Schriftarten zeigen es nicht an.
Wenn Sie es anzeigen müssen, würde ich empfehlen, es in der Anwendung anzuzeigen, nachdem es in Felder analysiert wurde.
quelle
Wahrscheinlich | oder ^ oder ~ Sie können auch zwei Zeichen kombinieren
quelle
Bei Verwendung verschiedener Sprachen gilt dieses Symbol: ¬
erwies sich als das Beste. Ich teste jedoch immer noch.
quelle
Sie sagten "druckbar", aber das kann Zeichen wie eine Registerkarte (0x09) oder einen Formular-Feed (0x0c) enthalten. Ich wähle für begrenzte Dateien fast immer Tabulatoren anstelle von Kommas, da Kommas manchmal im Text erscheinen können.
(Interessanterweise enthält die ASCII-Tabelle die Zeichen GS (0x1D), RS (0x1E) und US (0x1F) für Gruppen-, Datensatz- und Einheitentrennzeichen, unabhängig davon, welche diese sind / waren.)
Wenn mit "druckbar" ein Zeichen gemeint ist, das ein Benutzer erkennen und leicht eingeben kann, würde ich mich für die Pipe | entscheiden Symbol zuerst, mit ein paar anderen seltsamen Zeichen (
@
oder~
oder^
oder\
oder Backtick, die ich hier scheinbar nicht eingeben kann) als Möglichkeit. Diese Zeichen+=!$%&*()-'":;<>,.?/
scheinen bei Benutzereingaben wahrscheinlicher vorzukommen. Was Unterstrich_
und Hash#
und die Klammern{}[]
betrifft, weiß ich nicht.quelle
28 FS
Dateitrenner,29 GS
Gruppentrenner,30 RS
Datensatztrenner,31 US
Einheitentrenner. Leider benutzt sie so gut wie niemand, obwohl sie genau dafür gedacht sind. Persönlich verabscheue ich Dateien im CSV-Format, weil so viele Leute die Dinge nicht durchdenken und ein Chaos anrichten, mit dem wir Programmierer umgehen müssen, wenn wir ihre Dateiformate unterstützen wollen.Wie wäre es mit einem CSV-Format? Zeichen können in einem Standard-CSV-Format maskiert werden, und es sind bereits viele Parser geschrieben.
quelle
Können Sie ein Rohrsymbol verwenden? Dies ist normalerweise das zweithäufigste Trennzeichen nach durch Kommas oder Tabulatoren getrennten Zeichenfolgen. Es ist unwahrscheinlich, dass der meiste Text eine Pipe enthält, und ord ('|') gibt für mich 124 zurück, sodass dies Ihren Anforderungen zu entsprechen scheint.
quelle
Für eine schnelle Flucht verwende ich solche Dinge: Angenommen, Sie möchten str1, str2 und str3 zusammenfassen. Ich mache Folgendes:
dann, um die ursprüngliche Verwendung abzurufen:
Hinweis: Die Reihenfolge des Austauschs ist wichtig
Es ist unzerbrechlich und einfach zu implementieren
quelle
Pfeife für den Sieg! |
quelle
Wir verwenden ascii 0x7f, das pseudodruckbar ist und bei regelmäßiger Verwendung kaum auftaucht.
quelle
Dies kann je nach Situation und Sprache gut oder schlecht (normalerweise schlecht) sein. Beachten Sie jedoch, dass Sie das Ganze immer mit Base64 codieren können. Sie müssen sich dann nicht mehr darum kümmern, verschiedenen Mustern auf jeder Seite zu entkommen und sie zu entfernen, und Sie können Zeichenfolgen einfach anhand eines Zeichens trennen und teilen, das in Ihrem Base64-Zeichensatz nicht verwendet wird.
Ich musste auf diese Lösung zurückgreifen, wenn ich XML-Dokumente in XML-Eigenschaften / -Knoten einfügen wollte. Eigenschaften können überhaupt keine CDATA-Blöcke enthalten, und Knoten, die als CDATA maskiert wurden, können offensichtlich keine weiteren CDATA-Blöcke enthalten, ohne die Struktur zu beschädigen.
CSV ist jedoch wahrscheinlich für die meisten Situationen eine bessere Idee.
quelle
Nun, es wird in gewissem Maße von der Art Ihres Textes abhängen, aber ein vertikaler Balken 0x7C taucht nicht sehr oft im Text auf.
quelle
Ich glaube nicht, dass ich jemals ein kaufmännisches Und gefolgt von einem Komma in natürlichem Text gesehen habe, aber Sie können die Datei zuerst überprüfen, um festzustellen, ob sie das Trennzeichen enthält, und wenn ja, eine Alternative verwenden. Wenn Sie immer wissen möchten, dass das von Ihnen verwendete Trennzeichen keinen Konflikt verursacht, führen Sie eine Schleife durch, in der die Datei auf das gewünschte Trennzeichen überprüft wird. Wenn es vorhanden ist, verdoppeln Sie die Zeichenfolge, bis die Datei keine Übereinstimmung mehr aufweist . Es spielt keine Rolle, ob es ähnliche Zeichenfolgen gibt, da Ihr Programm nur nach genauen Trennzeichenübereinstimmungen sucht.
quelle
Sowohl Pfeife als auch Caret sind die offensichtliche Wahl. Ich würde bemerken, dass, wenn von Benutzern erwartet wird, dass sie die gesamte Antwort eingeben, Caret auf jeder Tastatur leichter zu finden ist als Pipe.
quelle