“块状”ASCII /文本文件作为输入

时间:2014-02-25 00:12:04

标签: r import

我想阅读一个文本文件(制表符分隔)。 问题是每组措施都是“逐块”组织的。

例如,使用此输入(bodydata.txt):

Body fat
08/21/2013  1:46 PM 17.4
08/20/2013  11:20 AM    17.4
08/17/2013  10:49 AM    17.2
08/16/2013  1:33 PM 17.4
08/15/2013  12:07 PM    17.5
08/14/2013  11:18 AM    17.4
08/13/2013  12:17 PM    17.3

Body weight
08/21/2013  1:46 PM 157
08/20/2013  11:20 AM    156.4
08/17/2013  10:49 AM    155
08/16/2013  1:33 PM 157
08/15/2013  12:07 PM    157
08/14/2013  11:17 AM    157
08/13/2013  12:16 PM    157.4
08/11/2013  4:47 PM 158.2

我想导入它们并为每个度量分别设置数据框:

> weight
          V1       V2   V3
1 08/21/2013  1:46 PM 17.4
2 08/20/2013 11:20 AM 17.4
3 08/17/2013 10:49 AM 17.2
4 08/16/2013  1:33 PM 17.4
5 08/15/2013 12:07 PM 17.5
6 08/14/2013 11:18 AM 17.4
7 08/13/2013 12:17 PM 17.3

在Unix环境中,使用sed(如this)拆分文本文件并不困难,但该解决方案不可移植。如果我能以R本地方式找到解决方案,那就太好了。有什么建议吗?

P.S。我无法想出在线搜索的好关键词。我会很感激任何文章/线程或谷歌搜索。如果有一篇我不知道的重复文章,我很抱歉。

1 个答案:

答案 0 :(得分:1)

您的文件没有标签,所以我将使用空格作为分隔符。我使用blenk行作为文件分隔符:

Lines <- readLines(textConnection("Body fat
08/21/2013  1:46 PM 17.4
08/20/2013  11:20 AM    17.4
08/17/2013  10:49 AM    17.2
08/16/2013  1:33 PM 17.4
08/15/2013  12:07 PM    17.5
08/14/2013  11:18 AM    17.4
08/13/2013  12:17 PM    17.3

Body weight
08/21/2013  1:46 PM 157
08/20/2013  11:20 AM    156.4
08/17/2013  10:49 AM    155
08/16/2013  1:33 PM 157
08/15/2013  12:07 PM    157
08/14/2013  11:17 AM    157
08/13/2013  12:16 PM    157.4
08/11/2013  4:47 PM 158.2")
)

sdat <- split(Lines, cumsum(nchar(Lines)==0))
lapply(sdat , function(lins) {
                 good<- lins[nchar(lins)>0]
                 assign(make.names(good[1]),   #name
                        read.table(text=good[-1]) , envir=.GlobalEnv) })

您将看到该函数打印拆分表,但作为副作用,您的全局环境中将有两个名为Body.fatBody.weight的对象。如果原始文件中确实有选项卡,您可能希望在read.table调用中放置sep =“\ t”。

相关问题