2

サードパーティのソフトウェアによって生成された一連のテキストファイルを解析する必要があるプログラムを書いています。これらのファイルの一部はフランスで生成されます。「1,5」のようなものは「1.5」を意味します。その他のファイルは米国で生成されます。「1.5」は数字ではなく、「1.5」は「1.5」です。もちろん、「1,234.5」は米国では正当な数字です。

これらは単なる例です。実際には、私のプログラムはさまざまなロケールでさまざまな数値を処理する必要があります。「e-5」や「2e10」などを処理する必要があります。残念ながら、どのファイルがどのロケールからのものかを事前に知る方法はありません。

C#でこの問題に対して一般的に受け入れられている解決策はありますか?私は自分の数値解析コードを書くことができることを理解していますが、他に方法がない限り、それを避けたいと思います...

4

3 に答える 3

1

入力ファイル全体が1つのロケールから生成されているため、実際に解析する前に、入力ファイルから特定のロケールを検出する必要があるという問題を見ることができます。これは、不適切な入力ファイルに起因する追加の要件です(すべて、合意された1つのロケールを使用するか、使用するロケールを指定するフィールドが必要です)。

数値のフォーマットは言語固有ではなくロケール固有であるため、言語検出は完全なソリューションではありません。次に例を示します。言語をスペイン語として検出した場合、それはes-ES(スペイン)またはes-MX(メキシコ)ですか?前者の場合、小数点はコンマ(1,23)です。後者の場合、小数点はピリオド(1.23)です。

解決策はヒューリスティックベースになります。最も簡単なのは、ロケールが一般的に何であるかを知っている場合(たとえば、ほとんどのユーザーがピリオドを使用している場合)、カルチャIDの順序付きリストを作成し、使用できるものが見つかるまで次々に試すことができることです。ファイル内のすべての数値を解釈します。en-USから始めるのと同じくらい簡単かもしれませんが、それができない場合は、en-GBを試してみてください。数字の場合、実際にはこれ以上の形式は多くないからです。

于 2012-11-06T10:07:39.997 に答える
0

これは多分少し過剰に設計された解決策ですが、うまくいく可能性があります(テキストファイルに数字以外のテキストが含まれている場合):

  1. 文字の頻度を使用してテキストファイルの言語を検出します。Googleは、ページ言語を検出するためにChromeで使用するコードをオープンソース化しました-http://code.google.com/p/chromium-compact-language-detector/。このためのC#ラッパーを見たと思いますが、今は見つかりません。ライブラリを使用したくない場合は、自分でライブラリを実装することはそれほど難しくありません。私はこのアルゴリズムの非常に簡単なテストをいくつか行いましたが、15〜20文字程度で言語を検出できるようです。
  2. 検出された言語のルールに基づいて正規表現を作成します(または単に解析します)。これは、小数点記号、数値のグループ化、負の符号などの規則が多数あることを考えると、非常に複雑な問題になる可能性があります。ただし、実装することは不可能ではありません。
于 2012-11-05T22:22:16.563 に答える
0

コメントからわかるように、あなたの問題には失敗のない解決策はありません。最善の方法は、エラーを最小限に抑えることです。

各ファイルには(うまくいけば)すべて同じロケールの複数の数値が含まれているため、予想されるすべての異なるロケールでファイル内の数値を解析してみてください(つまり、両方のロケールの数値形式として、たとえばen-USとen-AUで解析しないでください)同じです。)

解析後、次のいずれかになります。

  1. 単一の一致するロケール。
  2. 複数のロケール。

2番目のケースでは、すべてのロケールの結果が一致するかどうかをテストします(ほとんど/すべてのロケールは、千の区切り記号と科学的記数法なしで整数を同じ方法で解析します)。

それらが問題なく一致する場合は、ヒューリスティックを使用して正しいロケールを見つけてください。

  • 期待される範囲の値です。
  • ファイルに他のテキストがある場合は、言語辞書で単語検索を実行して、言語を理解することができます。

すべてが失敗した場合は、ファイルを破棄し、手動処理用にマークを付けます。プログラムには、ヒューリスティックをバイパスして特定のカルチャのファイルとしてマークを付けることができる機能が必要です。

データ、ファイル名、付随するメタデータファイルなど、どこかでファイルロケールが指定されるように、入力形式を変更するのが最善の選択です。

于 2012-11-05T22:31:27.433 に答える