【问题标题】:Parsing txt file in R在R中解析txt文件
【发布时间】:2023-03-12 02:12:01
【问题描述】:

我需要像这样解析一个txt文件:

2021 Sep 27 15:54:50     avg_dur     =      0.321 s
2021 Sep 27 15:54:52     avg_dur     =      0.036 s
2021 Sep 27 15:54:54     avg_dur     =      0.350 s
2021 Sep 27 15:54:56     avg_dur     =      0.317 s

我有兴趣解析 R 数据框中的日期和数字。 我正在尝试这样的解析器(仅适用于日期):

df <- read_table("myFile.txt", col_names = FALSE, col_types = cols(X1 = col_datetime(format = "%Y %b %d %H:%M:%S")))

但它不起作用:

Warning: 31502 parsing failures.
row col                    expected actual                                                file
  1  X1 date like %Y %b %d %H:%M:%S   2021 'uclStats/91.211.159.43-dash_d1_gwv_vos-u5.log-avg'
  2  X1 date like %Y %b %d %H:%M:%S   2021 'uclStats/91.211.159.43-dash_d1_gwv_vos-u5.log-avg'
  3  X1 date like %Y %b %d %H:%M:%S   2021 'uclStats/91.211.159.43-dash_d1_gwv_vos-u5.log-avg'
  4  X1 date like %Y %b %d %H:%M:%S   2021 'uclStats/91.211.159.43-dash_d1_gwv_vos-u5.log-avg'
  5  X1 date like %Y %b %d %H:%M:%S   2021 'uclStats/91.211.159.43-dash_d1_gwv_vos-u5.log-avg'
... ... ........................... ...... ...................................................
See problems(...) for more details.

问题显然是它试图用整个日期时间的配方解析第一列。

在数据框中解析这个txt文件的正确方法是什么?

问候, S.

【问题讨论】:

  • 您的文件是否包含除空格以外的任何空格字符?我会先导入文件,然后在单独的步骤中解析日期时间。
  • 我的文件包含不同数量的空格。
  • 您的评论没有回答我评论中的问题。
  • 对不起,我没有正确阅读您的评论。不,我的文件只包含分隔符之类的空格。

标签: r datetime parsing readr


【解决方案1】:

1) read.zoo 将其读入动物园对象z,然后将其转换为数据框(或将其保留为动物园对象)。这利用了在转换为 POSIXct 时将忽略索引列末尾的垃圾这一事实。

为了重现性,我们在最后的注释中使用了Lines,但text = Lines 可以替换为"myFile.txt"

library(zoo)

z <- read.zoo(text = Lines, sep = "=", 
  format = "%Y %b %d %H:%M:%S", tz = "", comment.char = "s")
fortify.zoo(z)

给出这个具有 POSIXct 和数字列的数据框:

                Index     z
1 2021-09-27 15:54:50 0.321
2 2021-09-27 15:54:52 0.036
3 2021-09-27 15:54:54 0.350
4 2021-09-27 15:54:56 0.317

2) Base R将其读入数据框dd,然后将第一列转换为POSIXct。

dd <- read.table(text = Lines, sep = "=", comment.char = "s")
dd$V1 <- as.POSIXct(dd$V1, format = "%Y %b %d %H:%M:%S")

注意

Lines <- "2021 Sep 27 15:54:50     avg_dur     =      0.321 s
2021 Sep 27 15:54:52     avg_dur     =      0.036 s
2021 Sep 27 15:54:54     avg_dur     =      0.350 s
2021 Sep 27 15:54:56     avg_dur     =      0.317 s"

【讨论】:

  • 这正是我想要的。谢谢
【解决方案2】:

这应该让您开始:阅读文本文件并用逗号(或分号等)替换空格(或任何分隔列的字符串)。然后使用text= 参数将其传递给read.csv。然后使用众多日期解析器中的任何一个将字符串转换为日期数据类型。

1.创建示例数据

txt <- "2021 Sep 27 15:54:50     avg_dur     =      0.321 s
2021 Sep 27 15:54:52     avg_dur     =      0.036 s
2021 Sep 27 15:54:54     avg_dur     =      0.350 s
2021 Sep 27 15:54:56     avg_dur     =      0.317 s"

2.使用read_lines读取数据。在您的情况下,txt 是文本文件的路径

read.csv(text=gsub("     ",  ", ", read_lines(txt)), sep=",", header = FALSE)

返回:

                    V1       V2 V3        V4
1 2021 Sep 27 15:54:50  avg_dur  =   0.321 s
2 2021 Sep 27 15:54:52  avg_dur  =   0.036 s
3 2021 Sep 27 15:54:54  avg_dur  =   0.350 s
4 2021 Sep 27 15:54:56  avg_dur  =   0.317 s

【讨论】:

  • 这将是一个很好的解决方法,但我猜他们想在阅读时使用 readr::read_table 进行解析。
  • 看表前为什么要用逗号代替空格?无论如何,这无论如何都不会解析日期。
  • 因为这样我们可以使用read.csv。然后可以像往常一样进行日期解析......(回答问题在数据框中解析这个txt文件的正确方法是什么?
  • 好的,我明白了....但是没有办法直接通过 readr 一次性进行解析?
  • 不幸的是,我对此表示高度怀疑。如果我们检查?readr::read_table,我们会发现 read_table() 和 read_table2() 旨在读取文本数据的类型,其中每一列由一列(或多列)空格分隔。 ->您的示例中的文本使用空格作为列和用于单词分隔......
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多