2

我正在编写一个程序,需要解析一些第三方软件生成的一堆文本文件。其中一些文件将在法国生成,其中“1,5”表示“一个半”。其他文件将在美国生成,其中“1,5”不是数字,“一个半”是“1.5”。当然,“1,234.5”在美国是一个合法的数字。

这些只是例子;实际上,我的程序需要处理各种语言环境中的各种数字;它需要处理诸如“e-5”和“2e10”之类的事情。不幸的是,没有办法提前知道哪个文件来自哪个语言环境。

在 C# 中是否有一些普遍接受的解决方案来解决这个问题?我意识到我可以编写自己的数字解析代码,但我宁愿避免它,除非没有其他办法......

4

3 回答 3

1

由于您的整个输入文件是从一个语言环境生成的,因此您可以将问题视为在实际解析输入文件之前必须从输入文件中检测特定语言环境。这是一个额外的要求,是由于输入文件不足(它们都应该使用一个约定的语言环境或有一个字段来指定所使用的语言环境)。

语言检测不是一个完整的解决方案,因为数字格式不是特定于语言的,而是特定于语言环境的。这是一个示例:如果您检测到语言是西班牙语,那是 es-ES(西班牙)还是 es-MX(墨西哥)?在前一种情况下,小数点分隔符是逗号 (1,23)。在后者中,小数分隔符是句点 (1.23)。

该解决方案将基于启发式。最简单的可能是,如果您知道您的语言环境通常是什么(例如,您的大多数用户使用句点),您可以拥有一个有序的文化标识符列表,然后一个接一个地尝试,直到找到可以使用的一个解释文件中的所有数字。可以像从 en-US 开始一样简单,如果失败了,尝试使用 en-GB,因为对于数字,实际上没有更多的格式。

于 2012-11-06T10:07:39.997 回答
0

这可能是一个设计过度的解决方案,但它可以工作(如果您的文本文件包含除数字之外的一些文本):

  1. 使用字母频率检测文本文件的语言。谷歌已经开源了他们在 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. 多个语言环境。

在第二种情况下,测试所有语言环境的结果是否匹配(大多数/所有语言环境都以相同的方式解析没有千位分隔符的整数和科学记数法。)

如果它们匹配没有问题,则尝试使用启发式方法来找出正确的语言环境:

  • 值是否在预期范围内。
  • 如果文件中有任何其他文本,您可以在语言词典中进行单词搜索以尝试找出语言。

如果一切都失败了,请丢弃该文件并将其标记为手动处理。您的程序应该具有允许绕过启发式将文件标记为特定文化的工具。

您最好的选择是更改输入格式,以便在某处指定文件区域设置,例如在数据、文件名或随附的元数据文件中。

于 2012-11-05T22:31:27.433 回答