在 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),可以读作:
#
(任何井号)但是
?
(什么)<
(在前面)
!
(不是)
^
(行首)
我正在尝试使用 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),可以读作:
#
(任何井号)但是?
(什么)<
(在前面)!
(不是)^
(行首)