我无法使用样本数据重现这一点,所以请耐心等一下。
我正在尝试合并两个data.table
,例如DT1
和DT2
;来自.csv文件的DT1
是fread
(应该是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正则表达式会搞砸我的合并尝试?