Por razones de codificación que lo horrorizarían (me da vergüenza decirlo), necesito almacenar varios elementos de texto en una sola cadena.
Los delimitaré usando un personaje.
¿Qué carácter es mejor utilizar para esto, es decir, qué carácter es menos probable que aparezca en el texto? Debe ser imprimible y probablemente menos de 128 en ASCII para evitar problemas de configuración regional.
ascii
delimiter
delimited-text
Rahul
fuente
fuente
|
en su texto, en realidad tuve un caso en el que necesitaba mantener los caracteres al mínimo tanto como fuera posible. Dado que la mayoría de los campos tenían cadenas con texto interesante, CSV no funcionó debido a muchos escapes. Nuestro delimitador de campo es/|
. La barra es solo moderadamente común, pero junto con una tubería con la que nunca se topa. He estado usando un motor que recibe muchos datos todos los días. Esto nunca se ha roto, y nunca he necesitado encapsular una sola cadena o escapar de un carácter especial. En promedio, este mecanismo nos ha ahorrado un pequeño porcentaje de texto.Respuestas:
Suponiendo que por alguna razón vergonzosa no pueda usar CSV, diría que vaya con los datos. Tome algunos datos de muestra y haga un conteo de caracteres simple para cada valor 0-127. Elija uno de los que no ocurren. Si hay demasiadas opciones, obtenga un conjunto de datos más grande. No tomará mucho tiempo escribirlo y obtendrá la mejor respuesta para usted.
La respuesta será diferente para diferentes dominios problemáticos, por lo que | (tubería) es común en los scripts de shell, ^ es común en las fórmulas matemáticas y probablemente lo mismo sea cierto para la mayoría de los demás caracteres.
Personalmente creo que apostaría por | (tubería) si tiene la opción, pero lo más seguro es ir con datos reales.
Y hagas lo que hagas, ¡asegúrate de haber elaborado un plan de escape!
fuente
additional_attributes
.\t
como delimitador?Elegiría "Separador de unidades", código ASCII "EE. UU.": ASCII 31 (0x1F)
En los viejos tiempos, la mayoría de las cosas se hacían en serie, sin acceso aleatorio. Esto significó que algunos códigos de control se integraron en ASCII.
Unit Separator está en ASCII, y hay soporte Unicode para mostrarlo (típicamente un "nosotros" en el mismo glifo) pero muchas fuentes no lo muestran.
Si debe mostrarlo, le recomendaría que lo muestre en la aplicación, después de analizarlo en campos.
fuente
Probablemente | o ^ o ~ también puedes combinar dos caracteres
fuente
Cuando se utilizan diferentes idiomas, este símbolo: ¬
demostró ser el mejor. Sin embargo, todavía estoy probando.
fuente
Dijiste "imprimible", pero eso puede incluir caracteres como una pestaña (0x09) o un avance de formulario (0x0c). Casi siempre elijo pestañas en lugar de comas para los archivos delimitados, ya que a veces pueden aparecer comas en el texto.
(Curiosamente, la tabla ascii tiene los caracteres GS (0x1D), RS (0x1E) y US (0x1F) para separadores de grupos, registros y unidades, sean cuales sean / fueron).
Si por "imprimible" te refieres a un carácter que un usuario pueda reconocer y escribir fácilmente, optaría por la tubería | símbolo en primer lugar, con algunos otros caracteres extraños (
@
o~
, o^
, o\
, o de acento grave que no puedo parecer para entrar aquí) como una posibilidad.+=!$%&*()-'":;<>,.?/
Parece que es más probable que estos caracteres aparezcan en la entrada del usuario. En cuanto al subrayado, el_
hash#
y los corchetes{}[]
, no lo sé.fuente
28 FS
Separador de archivos, Separador de29 GS
grupos,30 RS
Separador de registros,31 US
Separador de unidades. Desafortunadamente, casi nadie los usa, aunque eso es exactamente para lo que fueron diseñados. Personalmente, detesto los archivos en formato CSV porque muchas personas no piensan bien las cosas y crean un lío con el que los programadores tenemos que lidiar si queremos admitir sus formatos de archivo.¿Qué tal si usa un formato de estilo CSV? Los caracteres se pueden escapar en un formato CSV estándar, y ya hay muchos analizadores escritos.
fuente
¿Puedes usar un símbolo de tubería? Ese suele ser el siguiente delimitador más común después de las cadenas delimitadas por comas o tabulaciones. Es poco probable que la mayoría del texto contenga una tubería, y ord ('|') devuelve 124 para mí, por lo que parece ajustarse a sus requisitos.
fuente
Para escapar rápidamente, uso cosas como esta: digamos que desea concatinar str1, str2 y str3, lo que hago es:
luego para recuperar el uso original:
nota: el orden de reemplazo es importante
es irrompible y fácil de implementar
fuente
¡Pipe para la victoria! |
fuente
Usamos ascii 0x7f, que es pseudoimprimible y casi nunca aparece en el uso regular.
fuente
Esto puede ser bueno o malo (generalmente malo) dependiendo de la situación y el idioma, pero tenga en cuenta que siempre puede codificar todo en Base64. Entonces no tiene que preocuparse por escapar y eliminar varios patrones en cada lado, y simplemente puede separar y dividir cadenas según un carácter que no se usa en su juego de caracteres Base64.
He tenido que recurrir a esta solución cuando me he enfrentado a poner documentos XML en propiedades / nodos XML. Las propiedades no pueden tener bloques CDATA en absoluto, y los nodos escapados como CDATA obviamente no pueden tener más bloques CDATA dentro sin romper la estructura.
Sin embargo, CSV es probablemente una mejor idea para la mayoría de las situaciones.
fuente
Bueno, va a depender de la naturaleza de su texto hasta cierto punto, pero una barra vertical 0x7C no aparece en el texto muy a menudo.
fuente
No creo que haya visto nunca un ampersand seguido de una coma en texto natural, pero primero puede verificar el archivo para ver si contiene el delimitador y, de ser así, usar una alternativa. Si desea saber siempre que el delimitador que usa no causará un conflicto, haga un bucle verificando el archivo en busca del delimitador que desea, y si existe, duplique la cadena hasta que el archivo ya no tenga una coincidencia. . No importa si hay cadenas similares porque su programa solo buscará coincidencias exactas del delimitador.
fuente
Tanto la tubería como el cursor son las opciones obvias. Me gustaría señalar que si se espera que los usuarios escriban la respuesta completa, el signo de intercalación es más fácil de encontrar en cualquier teclado que la tubería.
fuente