2009-05-08 17 views
8

Sto scrivendo un esportatore CSV in Java che dovrebbe rispettare le impostazioni personalizzate dell'utente, in particolare il "separatore di elenco" da utilizzare come delimitatore.Come leggere 'List separator' dal SO in Java?

In Windows, si può impostare questo separatore di elenco in

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

Non so circa gli altri sistemi operativi, ma sono abbastanza sicuro che si può cambiare che su altri sistemi operativi, anche.

Qual è il modo migliore per ottenere questa impostazione personalizzata dal sistema operativo in Java? Sono in un ambiente Eclipse RCP, quindi potrei utilizzare le soluzioni correlate a RCP se c'è qualcosa di disponibile.

risposta

6

Dai commenti di this answer:

lettura l'impostazione specifica per OS è un bisogno che ho di incontrare.

Che importa se i sistemi operativi diversi da Windows non hanno tale impostazione?

Suggerisco di leggerlo dal registro su Windows (come accennato here): Read/write to Windows Registry using Java. Su altre piattaforme usa solo un buon valore predefinito, e forse, almeno su Unix, supporta anche la configurazione tramite una variabile d'ambiente personalizzata (che documenta bene): How can my java code read OS environment variables?.

La mia sensazione che i sistemi operativi universalmente non abbiano un'impostazione "Elenco separatori" (a livello di sistema o specifica dell'utente) può essere errata, ovviamente, ma ne dubito.

+0

Sono d'accordo, se altri sistemi operativi non hanno tale impostazione, la soluzione migliore è quella di ricorrere a un valore predefinito in questi casi. Nel caso di Windows, userò l'opzione di lettura del registro. – Simon07

-2

Per le finestre è memorizzato nel Registro di sistema:

"HKEY_CURRENT_USER\\Control Panel\\International" 

in modo da poter usare qualcosa di simile

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

Um, non era la domanda su * ottenere * "l'impostazione personalizzata dal sistema operativo in Java". (Inoltre, solo creando un oggetto Properties e impostandolo in quello sicuramente non scriverà nulla nel registro di Windows) – Jonik

+0

ok, quindi si usa getProperty (chiave) invece di setProperty (chiave, valore). e ti sbagli a non scriverlo sul registro di Windows. in effetti, è tutto ciò che deve essere fatto per scriverlo nel registro. –

+0

Informazioni sulla lettura/scrittura nel registro di Windows: http://stackoverflow.com/questions/62289/read-write-to-windows-registry-using-java – Jonik

6

Senza ricorrere ad una soluzione specifica piattaforma Penso che l'approccio migliore per prendere è sarà consentire agli utenti di specificare la loro preferenza per il separatore di lista all'interno della propria applicazione. In un pannello delle preferenze, una finestra di dialogo in fase di esportazione o tramite un argomento della riga di comando opzionale.

+0

Sì; Non penso che tutti i sistemi operativi abbiano tale impostazione "Lista separatore". (Almeno non ne ho mai sentito parlare su Linux, ad esempio) – Jonik

+0

Leggere le impostazioni specifiche del sistema operativo è una necessità che * devo * soddisfare. Altrimenti hai ragione, sarebbe sicuramente un modo più indipendente dalla piattaforma. – Simon07

2

Per curiosità, ho cercato un po 'l'argomento, e in effetti Java sembra non avere questa nozione fuori dalla scatola.

Il Locales Demo fornisce un elenco abbastanza completo delle impostazioni locali e non è presente alcun separatore di elenchi.

Ho visto un forum question riferito al pacchetto sun.text.resources, che è privato e deprecato. Non troverete molti altri riferimenti a questo pacchetto, sembra che viva in jre/lib/ext/localedata.jar anche se la mia copia recente di questa elenca principalmente locali asiatici.

I consigli sopra riportati sono validi, oppure è possibile ricercare e utilizzare un elenco privato per locale. Guarderei forse la libreria ICU di IBM (credo nel linguaggio C) che sembra avere una lista abbastanza ampia di impostazioni locali. Secondo a remark, ICU stessa ottiene le sue informazioni da uno standard ISO, che dovrebbe essere ricercato come fornitore di informazioni primarie.

5

Oltre a fornire la propria opzione all'utente nella propria applicazione, è possibile provare a indovinare quale sia il separatore di elenco.

Ho dato un'occhiata ad alcune impostazioni locali in Windows e ho visto che il separatore di lista è ";" o ",". Ho sentito che c'è un altro personaggio in qualche luogo oscuro, ma non l'ho visto da solo. Quindi se puoi fare in modo che il tuo codice gestisca entrambi ";" e "," come separatori di liste, probabilmente coprirai la maggior parte dei casi.

Inoltre, sembra che "," sia utilizzato come separatore decimale, quindi "," non viene mai utilizzato come separatore di elenchi. Immagino che questo sia altrimenti i numeri saranno impossibili da distinguere in una lista: 1,2,3,4 potrebbe essere 1,2, 3,4 o 1, 2,3 In questi casi ";" è usato come separatore di lista. Sfortunatamente il contrario non è vero. L'arabo ha "." come simbolo decimale e ";" come separatore di lista.

Quindi penso che la regola che può essere ragionevolmente seguita in modo sicuro è:

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

Ho affrontato lo stesso problema e anche scoperto che l'unica soluzione corretta è quella di fornire un modo per l'utente di specificare il " delimitatore di scelta ".

Tuttavia, se ciò non è possibile, come è stato nel mio caso, il più vicino ho potuto ottenere cross-platfrom, supporto cross-locale è la seguente:

  • indovinare i separatori è necessario utilizzare utilizzando DecimalFormatSymbols
  • aggiungere una riga all'inizio del CSV contenente, ad esempio, "settembre =," (senza virgolette), questo dovrebbe specificare il separatore di elenco che hai appena indovinato

questo, almeno nella maggior parte dei casi (i casi che ho testato), forzare Excel ad usare tha delimitatore, anche se "indovinato" e fornirà almeno un po 'più di compatibilità.

+0

Apache Commons CSV ha un problema con la lettura di un file che inizia con 'sep =' invece di un record valido. –