在 r 中的第一个元素之后从文本文件中删除特殊字符

delete special characters from a text file after the first element in r

我正在尝试使用 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

我想保留第一行中的井号,并删除最后一行中导致数据框出现问题的井号。

您可以使用正则表达式中称为捕获组的功能来完成此操作。

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

在“查找”框中,写入:(.+)(#)

在替换框中,写:$1

点击全部替换应该会删除文本之间的所有 # 个字符。

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

这是一个可能的纯 R 解决方案:

MWE

首先让我们把你的问题变成一个完整的 MWE (https://whosebug.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) 行。它使用 (?<!^)# 的 Negative Lookbehind (https://www.regular-expressions.info/lookaround.html),可以读作:

  • #(任何井号)但是
  • ?(什么)<(在前面)
  • !(不是)
  • ^(行首)