5

我正在解析纯文本并将其转换为键值对。例如纯文本:

some_uninteresting_thing
key1 valueA, some_uninteresting_thing  valueB
key2 valueD
key3 some_uninteresting_thing  valueE 
key4 valueG(valueH, valueI)
key5 some_uninteresting_thing 

和可能的映射:

 Map(

 key1 ->(valueA, valueB,valueC), 
 key2 ->(valueD, valueE),
 key3 ->(valueF)
 key4 ->(valueH, valueI)

 ...
 )

Amd 结果将是:

key1 ->(valueA, valueB)
key2 ->(valueD)
key4 ->(valueH, valueI)

(key5 不应该被映射,因为没有合适的值。正如你所看到的纯文本是宽松的。什么 java 库将有助于处理这个问题?

4

2 回答 2

3

如果您熟悉形式语言、标记化/语法等,则可以使用JavaCC 之类的解析器生成器。JavaCC 获取您编写的语法文件并生成将文本文件解析为一系列标记或语法树的 java 代码。有一些适用于 Maven 和 Ant 的插件可以帮助将这个额外的源代码集成到您的构建中。

对于仅运行时的解决方案,有RunCC,我使用它并取得了很好的效果。(我怀疑它不如 JavaCC 快,但就我而言,性能还不错。)

还有Chaperon,它使用语法文件将纯文本转换为 XML。

这些方法的替代方法是使用正则表达式和StringTokenizer.

有了解析器项目或正则表达式并准备就绪,您的一般方法是这样的:

  1. 为您的纯文本文件编写语法。缺少有关纯文本格式的一些详细信息,但您可以简单地使用 aBufferedReader.readLine()来读取文件的行,并将StringTokenizer行拆分为空格和逗号处的子字符串。
  2. 您从解析器获得的字符串、用作键的第一个字符串以及随后的字符串是值,您将它们添加到 Map。例如在伪代码中

    Map>map = new HashMap>(); 对于每一行 { List tokens = ...; // 分割线的结果 String key = tokens.get(0); map.add(key, tokens.sublist(1, tokens.size()); }

    即使解析器不过滤无意义的文本,它也会在稍后被过滤掉。

  3. 用上面的项目构建一个解析器来解析地图文件格式。同样,您可以使用正则表达式和 StringTokenizer 构建一个简单的解析器。使用解析器构建地图。该地图具有与上述相同的签名,即Map<String,List<String>>.

  4. 最后,根据允许值映射过滤输入映射。

像这样的东西。

   Map<String,List<String>> input = ...; // from step 1.
   Map<String,List<String>> allowed = ...; // from step 3.
   Map<String,List<String>> result = new HashMap<String<list<String>>(); // the final map
   for (String key : input.keySet()) {
      if (allowd.contains(key)) {
         List<String> outputValues = new ArrayList();
         List<String> allowedValues = allowed.get(key);
         List<String> inputValues = input.get(key);
         for (String value: inputValues) {
            if (allowedValues.contains(value))
                outputValues.add(value);
         }
         if (!outputValues.isEmpty())
            output.put(key, outputValues);
      }
   }
   // final result in filter
于 2010-04-29T00:31:52.817 回答
0

您可以使用解释器和生成器。

解释器解析源代码并识别键和值,然后传递给构建器,构建器构建您想要的任何数据结构。

于 2010-04-26T12:26:56.327 回答