将txt文件转换为数据框

炸薯条

我有一个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
r2evans

您可以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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章