2009-05-08 11 views
8

Escribo un exportador de CSV en Java que debe respetar la configuración personalizada del usuario, especialmente el "Separador de lista" para usar como delimitador.¿Cómo se lee 'List separator' del sistema operativo en Java?

En Windows, se puede establecer este separador de lista en

Control Panel -> Regional and Language Options -> Regional Options -> Customize 

No sé acerca de los otros sistemas operativos, pero estoy bastante seguro de que usted puede cambiar eso en otros sistemas operativos, también.

¿Cuál es la mejor manera de obtener esta configuración personalizada del sistema operativo en Java? Estoy en un entorno Eclipse RCP, por lo que podría usar soluciones relacionadas con RCP si hay algo disponible.

Respuesta

6

De los comentarios de this answer:

Lectura de la configuración específica del SO es una necesidad que tengo a cumplir.

¿Y qué si los sistemas operativos que no sea Windows no tienen ese entorno?

Le sugiero que lo lea desde el registro en Windows (como se aludió here): Read/write to Windows Registry using Java. En otras plataformas solo use un buen valor por defecto, y quizás, al menos en Unix, también permita la configuración a través de una variable de entorno personalizada (que documente bien): How can my java code read OS environment variables?.

Mi intuición de que los SO no tienen universalmente (todo el sistema o el usuario es específico) un ajuste de "Lista de separadores" puede ser incorrecto, por supuesto, pero lo dudo.

+0

Acepto, si otros sistemas operativos no tienen esa configuración, la mejor opción es volver a un valor predeterminado en estos casos. En el caso de Windows, usaré la opción de lectura del registro. – Simon07

-2

Por las ventanas se almacena en el registro en:

"HKEY_CURRENT_USER\\Control Panel\\International" 

esta manera puede utilizar algo como esto

private void setDelimiterProperties(String delimiter) { 
    Properties p = new Properties(); 
    String key = "HKEY_CURRENT_USER\\Control Panel\\International\\sList"; 
    p.setProperty(key, delimiter); 
} 
+2

Um, no era la pregunta sobre * obtener * la "configuración personalizada del sistema operativo en Java". (Además, solo crear un objeto Properties y configurarlo en eso seguramente no escribirá nada en el Registro de Windows tampoco) – Jonik

+0

ok, entonces usted usa getProperty (clave) en lugar de setProperty (clave, valor). y te equivocas al no escribirlo en el registro de Windows. de hecho, eso es todo lo que se necesita hacer para escribirlo en el registro. –

+0

Acerca de leer/escribir en el Registro de Windows: http://stackoverflow.com/questions/62289/read-write-to-windows-registry-using-java – Jonik

6

Sin recurrir a una solución específica de la plataforma Creo que el mejor enfoque a tomar es va a ser para permitir a los usuarios especificar su preferencia de separador de lista dentro de su propia aplicación. Ya sea en un panel de preferencias, en un cuadro de diálogo de exportación o mediante un argumento de línea de comando opcional.

+0

Yeah; No creo que todos los sistemas operativos tengan esa configuración de "Separador de listas". (Al menos, nunca lo escuché en Linux, por ejemplo) – Jonik

+0

Leer la configuración específica del sistema operativo es una necesidad que * tengo * que cumplir. De lo contrario, tienes razón, definitivamente sería una forma más independiente de la plataforma. – Simon07

2

Por curiosidad, busqué un poco el tema, y ​​de hecho parece que Java no tiene esa noción fuera de la caja.

El Locales Demo proporciona una lista bastante completa de configuraciones regionales y no hay un separador de listas allí.

Vi un forum question haciendo referencia al paquete sun.text.resources, que es privado y obsoleto. No encontrarás muchas otras referencias a este paquete, parece que vive en jre/lib/ext/localedata.jar, aunque mi copia reciente de esta lista en su mayoría locales asiáticos.

Los consejos anteriores son sólidos, o puede investigar y usar una lista privada por localidad. Vería quizás la biblioteca ICU de IBM (creo que en el lenguaje C) que parece tener una lista bastante grande de configuraciones regionales. De acuerdo con a remark, la ICU obtiene su información de un estándar ISO, que debe investigarse como proveedor de información primaria.

5

Además de proporcionar su propia opción al usuario en su aplicación, puede tratar de adivinar qué es el separador de listas.

Eché un vistazo a algunas configuraciones regionales en Windows y vi que el separador de la lista es ";" o ",". Escuché que hay otro personaje en algún lugar oscuro, pero no lo he visto. Entonces, si puede hacer que su código maneje ambos ";" y "," como separadores de listas, entonces probablemente cubrirá la mayoría de los casos.

Además, parece que cuando "," se usa como un separador decimal, entonces "," nunca se utiliza como un separador de lista. Supongo que esto es distinto. Los números serán imposibles de distinguir en una lista: 1,2,3,4 podría ser 1.2, 3.4 o 1, 2.3 En estos casos ";" se usa como un separador de lista. Lamentablemente, lo contrario no es cierto. El árabe tiene "." como un símbolo decimal y ";" como un separador de lista.

Así que creo que la regla que puede ser razonablemente siguió con seguridad es:

if (decimalSeparator == ',') 
    then listSeparator = ';' 
else if (decimalSeparator == '.') 
    then listSeparator = new char[] {';', ','} 
1

que se enfrentó al mismo problema y también descubrí que la única solución adecuada es proporcionar una manera de que el usuario especifique el " delimitador de elección ".

Sin embargo, si eso no es posible, como lo fue en mi caso, lo más cerca que podía llegar a través del platfrom, el apoyo transversal de la configuración regional es el siguiente:

  • adivinar los separadores que necesita para utilizar utilizando DecimalFormatSymbols
  • añadir una línea al comienzo de la CSV que contiene, por ejemplo "sep =" (sin comillas), esto debe especificar el separador de lista que acabas adivinado

esto, al menos, en la mayoría de los casos (los casos que he probado), fuerce a Excel a usar tha t delimitador, incluso si "adivinó mal" y proporcionará al menos un poco más de compatibilidad.

+0

Apache Commons CSV tiene un problema con la lectura de un archivo que comienza con 'sep =' en lugar de un registro válido. –

Cuestiones relacionadas