5

我正在使用槌主题建模示例代码,虽然它运行良好,但我想知道这个语句的参数实际上是什么意思?

instances.addThruPipe(new CsvIterator(new FileReader(dataFile),
                                      "(\\w+)\\s+(\\w+)\\s+(.*)",
                                      3, 2, 1)  // (data, target, name) field indices                    
                     );
4

2 回答 2

8

文档中:

这个迭代器,也许更恰当地称为 Line Pattern Iterator,读取文件并根据正则表达式每行返回一个实例。

如果您有表格的数据

[名称] [标签] [数据]

您感兴趣的电话是

CsvIterator(java.io.Reader input, java.lang.String lineRegex, 
            int dataGroup, int targetGroup, int uriGroup) 

第一个参数是读取数据的方式,例如文件读取器或字符串读取器。第二个参数是用于从读取器读取的每一行中提取数据的正则表达式。在你的例子中,你得到了(\\w+)\\s+(\\w+)\\s+(.*)which 转化为:

  • 1 个或多个字母数字字符(捕获组,这是实例的名称),后跟
  • 1 个或多个空白字符(制表符、空格、..),后跟
  • 1 个或多个字母数字字符(捕获组,这是标签/目标),后跟
  • 1 个或多个空白字符(制表符、空格、..),后跟
  • 0 个或多个字符(这是数据)

数字3, 2, 1表示数据在后,目标在后,名称在前。正则表达式基本上确保每行的格式如文档中所述:

test1 spam Wanna buy viagra?
test2 not-spam Hello, are you busy on Sunday?

CsvIterator是一个糟糕的名字,因为这个类读入的实际上不是逗号分隔的值,而是空格分隔的(空格、制表符、...)值。

于 2015-01-13T18:51:03.700 回答
0

上面答案中给出的解释太好了。

但是缺少一点。Line 正则表达式中输入实例的每个数据、标签和名称字段的正则表达式序列(正则表达式)需要与输入文件中提供实例的方式相对应,即如果说您将名称作为第一个字段提供,则数据作为输入文件中的第二个字段和标签作为第三个字段,那么您必须首先提供名称的正则表达式,然后是数据的正则表达式,然后是标签的最后一个正则表达式。示例如下所示:

输入实例:Mail67(tab space)TCC 问题。您好,由于某种原因,古画部没有管理员能够从 TCC 获得信息。它似乎在 JDE 上通过,但在 TCC 上搜索时什么也没有出现。您可以向 f....(tab space)Inc 提供的任何帮助或指导

CsvIterator 参数:CsvIterator(new FileReader(文件路径), "(\w+)\t(.*)\t(\w+)",2,3,1)

于 2016-09-17T09:19:37.120 回答