gpt4 book ai didi

r - 导入不带行分隔符的固定宽度数据文件

转载 作者:行者123 更新时间:2023-12-03 06:03:51 25 4
gpt4 key购买 nike

我有没有行分隔符的固定宽度数据文件 (.dbf)。该数据文件的两行如下所示:

20141101 77h  3.210                                  0    3 20141102 76h  3.090                                  0    3 

对于日期 (8)、某些时间度量 (4)、数据点 (7) 和其他一些列,一行的宽度为 c(8,4,7,41)我可以在一个“休息”栏(41)中总结这一点。一行之后没有分隔符,下一行仅附加到第一行。所有时间步基本上都是连续写在一大行中。该文件中只有数字、字符和空格。

使用 read.fwf('filepath', widths = c(8,4,7,41)) R 由于缺少行分隔符而在第一行之后停止读取。

是否有参数告诉 read.fwf() 在没有行分隔符的情况下何时开始读取新行?或者我应该使用不同的读取命令?

提前致谢。

最佳答案

也许不是最好的主意,但这应该可行:

content <- scan('filepath','character',sep='~') # Warning choose a sep not appearing in datas to get the whole file.
# Split content in lines:
lines <- regmatches(content,gregexpr('.{60}',content))[[1]]
x <- tempfile()
write(lines,x)
data <- read.fwf(x, widths = c(8,4,7,41))
unlink(x)

这个想法是读取整个文件,将每次出现的 60 个字符放入一个条目中,将其写入临时文件,并在删除临时文件之前从该临时文件中读取数据。

另一种方法可以使用正则表达式和包 stringr (仍然包含上面扫描得到的内容):

library(stringr)
d <- data.frame( str_match_all( content, "(.{8})(.{4})(.{7})(.{41})")[[1]][,2:5], stringsAsFactors=FALSE)

给出:

        V1   V2      V3                                        V4
1 20141101 77h 3.210 0 3
2 20141102 76h 3.090 0 3

str_match_all返回一个列表,这里有 1 个元素,因为只有一行作为输入,所以我们用 [[1]] 删除它.

现在返回的是 5 列,第一列是完全匹配,其他是捕获组,因此我们在第 2 列到第 5 列上对矩阵进行子集化,以仅获取我们需要的 4 列并将其包装在 as.data.frame 中。最后得到一个 data.frame 。

然后您可以使用 colnames(d) <- c('date','time','data_point','rest') 命名列

如果您希望清除空格,可以将 str_extract_all 结果包装在 trimws 中(感谢@jaap提醒这个功能)像这样:

td <- data.frame( trimws( str_match_all( content, "(.{8})(.{4})(.{7})(.{41})")[[1]][,2:5] ), stringsAsFactors=FALSE)

输出:

        X1  X2    X3     X4
1 20141101 77h 3.210 0 3
2 20141102 76h 3.090 0 3

关于r - 导入不带行分隔符的固定宽度数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com