从r

时间:2018-09-22 01:20:16

标签: r text-editor

我正在尝试使用R中的read.table()读取文本文件。R不会读取#之后的任何内容。但是,文本中有磅符号与注释无关。我想删除不需要的#符号而不在数据框中添加注释。

幸运的是,我要保留的所有英镑符号都位于每一行的第一个元素中。因此,基本上我需要删除不在行首元素中的所有#符号。

2018-08-14 00:00:42 102.18.18.2  
2018-08-15 00:00:47 223.45.67.8    
2018-08-15 00:00:48 026.15.65.0    
2018-08-15 00:00:49 924.43.47.0    
2018-08-15 00:00:49 122.45.#67.9

我想在第一行保留英镑符号,并在最后一行删除导致数据帧出现问题的英镑符号。

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式中称为捕获组的功能来做到这一点。

只需在支持使用RegEx(例如VS Code)查找文本的编辑器中打开文件即可。

在“查找”框中,输入:(。+)(#)

在替换框中,输入:$ 1

单击全部替换将删除您在文本之间的所有#个字符。

或者,您也可以编写脚本来执行此操作。

答案 1 :(得分:0)

这可能是纯R解决方案:

MWE

首先,让您的问题成为完整的MWE(https://stackoverflow.com/help/mcve):

cat(
'#2018-08-14 00:00:42 102.18.18.2',
'2018-08-14 00:00:42 102.18.18.2',  
'2018-08-15 00:00:47 223.45.67.8',    
'2018-08-15 00:00:48 026.15.65.0',    
'2018-08-15 00:00:49 924.43.47.0',    
'2018-08-15 00:00:49 122.45.#67.9', sep = '\n', file = 'mytable.txt')

这将在您的工作目录中创建一个文件,我们可以读取该文件。

解决方案

(x <- readLines('mytable.txt')) 
(y <- gsub('(?<!^)#', '', x, perl = TRUE))
read.table(text = y)

##           V1       V2          V3
## 1 2018-08-14 00:00:42 102.18.18.2
## 2 2018-08-15 00:00:47 223.45.67.8
## 3 2018-08-15 00:00:48 026.15.65.0
## 4 2018-08-15 00:00:49 924.43.47.0
## 5 2018-08-15 00:00:49 122.45.67.9

我用()包裹了每一行,因此您可以看到输出。在实际应用中,我不会包含它们。

神奇之处在于gsub('(?<!^)#', '', x, perl = TRUE)行。它使用(?<!^)#的负向后搜索(https://www.regular-expressions.info/lookaround.html),可以读取为:

  • #(任何磅号)但
  • ?(什么)<(之前)
  • !(不是)
  • ^(该行的开头)