Frage

Nachdem wir die unangenehme überraschung, Comma Seperated Value (CSV) - Dateien werden nicht notwendigerweise Komma-getrennt, ich bin versucht, herauszufinden, ob es irgendeinen Weg gibt, zu erkennen, was dem regionalen Einstellungen Liste separator-Wert ist auf der client-Maschine, von der http-Anforderung.

Szenario ist wie folgt:Benutzer können download einige Daten in das CSV-format von der Website (RoR, wenn es darauf ankommt).Die CSV-Datei dynamisch erstellt wird, an den Benutzer gesendet, und die meisten der Zeit, die Doppel-angeklickt und geöffnet in MS Excel auf dem Windows-Maschine am Ziel.Nun, wenn der Benutzer hat ',' als Trennzeichen, werden die Daten korrekt in Spalten angeordnet sind, aber wenn ein beliebiges Trennzeichen (';' weit verbreitet ist und hier) festgelegt ist, es wird nur geworfen in einer einzigen Spalte.Also, gibt es eine Möglichkeit zu erkennen, welche Trennzeichen verwendet wird, auf der client-Maschine, und erzeugen Sie die Datei entsprechend?

Ich habe ein sinkendes Gefühl, dass es nicht, aber ich möchte sicher sein bevor ich die "kann nicht durchgeführt werden, sorry" - Zeile für den Kunden :)

War es hilfreich?

Lösung

Hier ist eine JavaScript-Lösung, die ich gerade geschrieben habe auf der Grundlage der Methode gezeigt hier :

function getListSeparator() {
    var list = ['a', 'b'], str;
    if (list.toLocaleString) {
        str = list.toLocaleString();
        if (str.indexOf(';') > 0 && str.indexOf(',') == -1) {
            return ';';
        }
    }
    return ',';
}

Der Schlüssel ist in der toLocaleString () Methode, die die Systemliste Separator verwendet.

Sie können JavaScript verwenden, um die List-Trennzeichen zu bekommen und es in einem Cookie gesetzt, die Sie dann von Ihrem Server erkennen kann.

Ich habe alle Windows-Locales, und es scheint, dass die Standard-Listentrenn praktisch immer entweder ist ‚‘ oder ‚;‘. Bei einigen Gegenden der Dropdown-Liste in der Systemsteuerung bietet beide Optionen; für die anderen bietet es gerade ‚‘. Eine locale, Divehi, hat eine seltsame Zeichen, die ich vorher nicht als Listentrenn gesehen, und für jede locale, ist es möglich, dass der Benutzer eine beliebige Zeichenfolge sie als Listentrenn eingeben möchten.

Setzen zufällige Zeichenfolge als Trennzeichen in einer CSV-Datei klingt wie Ärger zu mir, so meine Funktion wird oben nur entweder eine Rückkehr ‚;‘ oder ein, und es wird nur das Rück a ‚‘ ‚;‘ wenn es nicht ein ‚‘ in der Array.toLocaleString Zeichenfolge finden. Ich bin nicht ganz sicher, ob array.toLocaleString ein Format hat, das in allen Browsern garantiert wird, damit die indexOf prüft, anstatt ein Zeichen an einem bestimmten Index herauszuzupicken.

Array.toLocaleString Verwendung des Listentrenn arbeitet auf IE6, IE7 und IE8 zu bekommen, aber leider scheint es nicht auf Firefox, Safari zu arbeiten, Opera und Chrome (oder zumindest den Versionen dieser Browser auf meinem Computer). sie scheinen alle Array-Elemente mit einem Komma zu trennen, und zwar unabhängig von der Windows-„Listentrennzeichen“ Einstellung

Auch erwähnenswert, dass standardmäßig Excel das System „Dezimaltrennzeichen“ zu verwenden, scheint, wenn es Zahlen aus CSV-Dateien parsen. Yuk. Also, wenn Sie das Listentrennzeichen sind lokalisierende Sie könnten auch das Dezimaltrennzeichen lokalisieren möchten.

Andere Tipps

Ich denke, jeder Calc von Openoffice verwenden sollte - es fragt, wenn Sie eine Datei über Codierung öffnen, Spaltentrenn und andere. Ich weiß nicht, Antwort auf Ihre Frage, aber vielleicht können Sie versuchen, Daten in HTML-Tabellen zu senden oder in xml - Excel sollte korrekt beide lesen. Aus meiner Erfahrung ist es nicht einfach, Daten exportieren zu übertreffen. Vor ein paar Wochen habe ich Problem mit ihm und nach wenigen Stunden Arbeit fragte ich eine Person, die nicht meine CSV-Datei in Excel, über die Version öffnen konnte. Es war Excel 98 ...

Werfen Sie einen Blick auf html Beispiel und xml .

Könnten Sie haben nur die Benutzer ohne Komma Separatoren ein Profil Art von Option und dann CSVs generieren basierend auf Benutzereinstellungen mit dem Standard Kommas zu sein?

Toms, soweit ich weiß gibt es keine Möglichkeit zu erreichen, was Sie wollen. Die Sie tun können, ist versuchen, und das Benutzergebietsschema zu erkennen und es mit einer Datenbank von locales / Listentrenn Karte als Ergebnis des Listentrennzeichen in der CSV-Datei zu ändern.

Die einfacher version der getListSeparator Funktion, dass ein Charakter zu werden separator:

function getListSeparator_bis()
{
    var list = ['a', 'b'];
    return(list.toLocaleString().charAt(1));
}// getListSeparator_bis

Setzen Sie einfach einen beliebigen char (f.e.'#') als Listentrennzeichen in Ihrem Betriebssystem, und versuchen Sie den code wie oben.Die entsprechenden char (d.h.'#', wenn set als sugested) zurückgegeben wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top