我有一个 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
(这满足了您第五行的遗漏)。
正则表达式的说明:
- 一般来说:
-
*
表示零个或多个前一个字符(或字符类) -
+
表示一个或多个 -
?
(未使用,但仍然有用)表示零或一 -
^
和$
分别表示字符串的开头和结尾(^
内的[..]
是不同的) -
(...)
是一个捕获组:非转义括号内的任何内容都会存储,任何不在的内容都会被丢弃 -
[...]
是一个字符组,任何字符都是匹配项;如果是[^..]
,然后它被反转:任何除了列出的内容 -
[[...]]
是一个字符类
-
-
^(\\S+)
,以 (^
) 一个或多个 (+
) 非空格字符 (\\S
) 开头; -
\\s+
一个或多个空格字符 (\\s
)(丢弃); -
([^(]+)
一个或多个不是左括号的字符; -
\\((.*)\\)$
一个文字左括号(\\(
),然后零个或多个任何内容(.*
),一直到文字右括号(\\)
) )和字符串结尾($
)。
需要注意的是\\s
和\\S
是非 POSIX 正则表达式字符,通常建议使用 [^[:space:]]
对于 \\S
(无空格字符)和 [[:space:]]
对于 \\s
。这些是等效的,但我最初选择了代码高尔夫。通过这个替换,它看起来像
out <- strcapture("^([^[:space:]]+)[[:space:]]+([^(]+)[[:space:]]+\\((.*)\\).*$", txt,
proto = data.frame(ID=0L, Message="", Comment=""))
关于r - 将txt文件转换为dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64210993/