r - 将txt文件转换为dataframe

标签 r regex dataframe

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

相关文章:

ruby - 在 ruby​​ 中使用正则表达式确保字符串不包含数字?

python - 如何从python中的输入更改脚本

r 从包含 2 列组合的副本的数据框中删除行

javascript - 使用 highcharter 或 Rcharts 将图例添加到饼图

regex - Linux 终端中整个目录的正则表达式搜索和替换

javascript - mustache 式双括号的正则表达式?

R:制作一个可用于 Shiny selectInput 的唯一值列表

r - 一系列数据开始时的滚动方式和应用方式

r - 检查列数据中是否有空格

r - 在 R 中使用多个省略号参数