我有一个txt文件,其中包含以下数据:
1 message («random_choice»)[5];
2 reply («принято»)[2][3];
3 regulate («random_choice»)[5];
4 Early reg («for instance»)[2][3][4];
4xx: Success (загрузка):
6 OK («fine»)[2][3];
我想将其转换为数据框,该数据框由三列ID,消息,注释组成。我也想删除方括号末尾不必要的数字。并且ID列中的某些值也包含字符串(通常为xx)。在这些情况下,列必须为空。因此,所需的结果必须如下所示:
ID Message Comment
1 message random_choice
2 reply принято
3 regulate random_choice
4 Early reg for instance
Success загрузка
6 OK fine
我该怎么办?即使当我尝试读取此txt文件时,我也会收到奇怪的错误:
df <- read.table("data_received.txt", header = TRUE)
我得到的错误:
Error in read.table("data_received.txt", header = TRUE) :
more columns than column names
您可以strcapture
为此使用。
伪造数据,您可能会这样做txt <- readLines("data_received.txt")
。(由于我在Windows上的语言环境对这些字符串不友好,因此假设它在您的系统上可以正常工作,我将用纯正的ascii代替。)
txt <- readLines(textConnection("1 message («random_choice»)[5];
# 2 reply («asdf»)[2][3];
# 3 regulate («random_choice»)[5];
# 4 Early reg («for instance»)[2][3][4];
# 4xx: Success (something):
# 6 OK («fine»)[2][3];"))
突破:
out <- strcapture("^(\\S+)\\s+([^(]+)\\s+\\((.*)\\).*$", txt,
proto = data.frame(ID=0L, Message="", Comment=""))
# Warning in fun(mat[, i]) : NAs introduced by coercion
out
# ID Message Comment
# 1 1 message «random_choice»
# 2 2 reply «asdf»
# 3 3 regulate «random_choice»
# 4 4 Early reg «for instance»
# 5 NA Success something
# 6 6 OK «fine»
该proto=
参数指示生成什么类型的列。由于我设置了ID=0L
,它假定它将是整数,所以任何不转换为整数的东西都将变为NA
(满足您的第五行遗漏)。
关于正则表达式的说明:
*
表示零个或多个前一个字符(或字符类)+
意味着一个或多个?
(未使用,但仍然有用)表示零或一^
和分别$
表示字符串的开头和结尾(^
内部的a[..]
不同)(...)
是一个捕获组:存储未逃避的parens中的任何内容,不丢弃的任何内容[...]
是一个字符组,任何字符都是一个匹配项;如果是[^..]
,则将其反转:除了列出的内容以外的任何内容[[...]]
是角色类^(\\S+)
,以(^
)一个或多个(+
)非空格字符(\\S
)开头;\\s+
一个或多个空格字符(\\s
)(已舍弃);([^(]+)
一个或多个不是左括号的字符;\\((.*)\\)$
一个文字左括号(\\(
),然后零个或更多的东西(.*
),一路文字右括号(\\)
)和字符串的结尾($
)。应当注意,\\s
和\\S
是非POSIX regex字符,通常建议在其中使用[^[:space:]]
for \\S
(不带空格)和[[:space:]]
for \\s
。这些是等效的,但我最初使用代码高尔夫球。有了这个替换,看起来像
out <- strcapture("^([^[:space:]]+)[[:space:]]+([^(]+)[[:space:]]+\\((.*)\\).*$", txt,
proto = data.frame(ID=0L, Message="", Comment=""))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句