使用PERL正则表达式打破了两个data.tables

时间:2015-12-24 21:26:26

标签: regex r encoding gsub

我无法使用样本数据重现这一点,所以请耐心等一下。

我正在尝试合并两个data.table,例如DT1DT2;来自.csv文件的DT1fread(应该是UTF-8,我自己在Linux上的LibreOffice Calc中自己编写时指定了这个文件),并且从{.1}}读取了DT2。带有readxl::read_excel的xls文件。不确定后者的编码,但您可以获取文件here

我尝试在其中一个列的正则表达式版本上进行匹配。我用来清理两个表中的列的正则表达式是gsub("[[:punct:]]|\\(.*\\)", "", id)。桌子合并得很好;但是,为了改进匹配,我意识到我还应该使用更新的正则表达式排除前导,尾随和重复的空格(即实现this白色空间清理方法):

gsub("(?<=[\\s])\\s*|^\\s+|\\s+$|[[:punct:]]|\\(.*\\)", "", name, perl = TRUE)

然而,这样做会引入警告,并且匹配的质量会下降:

  

警告讯息:   在bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch,中:     在连接列中检测到已知编码(latin1或UTF-8)。 data.table比较当前的字节数,因此不支持混合编码;即,同时使用latin1和UTF-8,或者如果任何未知编码是非ascii,其中一些已标记为已知而其他未标记。但是如果单独使用latin1或UTF-8,并且所有未知编码都是ascii,那么结果应该没问题。将来我们会检查你,如果一切正常,请避免这个警告。棘手的部分是这样做而不会影响ascii案例的性能。

看起来简单地激活perl会导致编码发生某些事情并使我的合并失效。我在?regex稍微探讨了一下,似乎PERL以不同方式处理单独的编码,但检查Encoding没有帮助 - DT1[ , Encoding(id)]DT2[ , Encoding(id)]都是 all) 未知。

为什么从POSIX更改为PERL正则表达式会搞砸我的合并尝试?

0 个答案:

没有答案