8

カンマ区切り値(CSV)ファイルが必ずしもカンマ区切りではないという不愉快な驚きを持った後、httpリクエストからクライアントマシンの地域設定リストの区切り値を検出する方法があるかどうかを調べようとしています。

シナリオは次のとおりです。ユーザーは、Webサイト(重要な場合はRoR)からCSV形式のデータをダウンロードできます。そのCSVファイルはその場で生成され、ユーザーに送信され、ほとんどの場合、宛先のWindowsマシン上のMSExcelでダブルクリックして開きます。これで、ユーザーがリストセパレータとして「、」を設定している場合、データは列に適切に配置されますが、他のセパレータ(ここでは「;」が広く使用されています)が設定されている場合、すべてが1つの列にスローされます。それで、クライアントマシンで使用されているセパレータを検出し、それに応じてファイルを生成する方法はありますか?

そうではないという沈没感がありますが、お客様に「できません、ごめんなさい」の行を渡す前に確認したいと思います:)

4

5 に答える 5

14

ここに示すメソッドに基づいて作成した JavaScript ソリューションを次に示します

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

キーは、システム リスト セパレータを使用する toLocaleString() メソッドにあります。

JavaScript を使用してリスト セパレーターを取得し、サーバーから検出できる Cookie に設定することができます。

すべての Windows ロケールを調べたところ、デフォルトのリスト区切り文字はほぼ常に「,」または「;」のようです。一部のロケールでは、コントロール パネルのドロップダウン リストに両方のオプションが表示されます。それ以外の場合は、「,」のみを提供します。1 つのロケール Divehi には、これまで見たことのない奇妙な文字がリスト セパレーターとして使用されています。また、どのロケールでも、ユーザーは任意の文字列をリスト セパレーターとして入力できます。

CSV ファイルの区切り文字としてランダムな文字列を配置するのは面倒に思えるので、上記の関数は「;」のいずれかのみを返します。または「.」、および「;」のみを返します Array.toLocaleString 文字列に「,」が見つからない場合。array.toLocaleString の形式がブラウザー間で保証されているかどうかについては完全にはわかりません。したがって、 indexOf は特定のインデックスで文字を選択するのではなくチェックします。

Array.toLocaleString を使用してリスト セパレーターを取得すると、IE6、IE7、および IE8 で機能しますが、残念ながら、Firefox、Safari、Opera、および Chrome (または少なくとも私のコンピューター上のこれらのブラウザーのバージョン) では機能しないようです。 Windowsの「リスト区切り」の設定に関係なく、それらはすべて配列項目をコンマで区切っているようです。

また、デフォルトでは、CSV ファイルから数値を解析する際に、Excel がシステムの「小数点記号」を使用しているように見えることにも注意してください。ユク。そのため、リスト区切り記号をローカライズする場合は、小数点記号もローカライズする必要があります。

于 2010-05-11T17:12:48.950 に答える
1

誰もが OpenOffice の Calc を使用するべきだと思います。ファイルを開くと、エンコーディング、列区切りなどについて尋ねられます。あなたの質問に対する答えはわかりませんが、データを html テーブルまたは xml で送信してみてください。Excel は両方を正しく読み取るはずです。私の経験から、データを Excel にエクスポートするのは簡単ではありません。数週間前に問題が発生し、数時間の作業の後、csv ファイルを Excel で開けない人にバージョンについて尋ねました。エクセル98でした…

html の例xmlを見てください。

于 2009-06-18T15:01:21.193 に答える
1

getListSeparator 関数のより単純なバージョンで、任意の文字を区切り文字にすることができます。

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

OS で任意の文字 (fe '#') をリスト セパレータとして設定し、上記のコードを試してください。適切な文字 (つまり、提案されている場合は「#」) が返されます。

于 2010-12-13T22:07:05.160 に答える
0

カンマ区切り以外のユーザーにプロファイルの種類のオプションを設定してもらい、デフォルトがカンマのユーザー設定に基づいて CSV を生成することはできますか?

于 2009-06-18T14:53:01.897 に答える
0

トムズ、私の知る限り、あなたが求めているものを達成する方法はありません. できることのほとんどは、ユーザー ロケールを検出してロケール/リスト セパレータのデータベースにマップし、結果として .CSV ファイルのリスト セパレータを変更することです。

于 2009-06-18T14:59:39.853 に答える