【问题标题】:Single text file with multiple tables具有多个表格的单个文本文件
【发布时间】:2014-12-11 16:04:14
【问题描述】:

我正在尝试从具有多个表的单个文本文件中导入数据。这些表格的长度各不相同,但每个表格之间都有一个共同的部分。每个表之间的分隔符是一个数字后跟一个字符。例如,

19,EOP
1,10.,92.9144,202.1271,0,B,10-Dec-2014 11:46

2,5.,0.,153.3754,0.,,10-Dec-2014 11:52

3,5.,20380.8867,162.0626,24555.9395,,10-Dec-2014 11:58

4,5.,21941.2773,197.9289,25361.4414,,10-Dec-2014 12:04

10,EOP
1,0.98,164702.1563,179.828,0,B,10-Dec-2014 09:46

2,1.08,0.,180.6869,0.,,10-Dec-2014 09:48

3,1.07,0.,190.6853,0.,,10-Dec-2014 09:50

4,1.32,0.,163.7527,0.,,10-Dec-2014 09:52

5,1.29,0.,167.3766,0.,,10-Dec-2014 09:54

我一直在尝试使用读取表格功能,但我似乎无法使用该功能来识别表格指示器。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以尝试使用我的 GitHub 专用 "SOfun" package 中的 read.mtable

    使用您共享的保存在我当前工作目录中名为“test.txt”的文件中的示例数据,我尝试了以下操作:

    library(SOfun) ## Or just copy and paste the function for your session...
    read.mtable("test.txt", chunkId = "\\d+,EOP", header = FALSE, sep = ",")
    # $`19,EOP`
    #   V1 V2         V3       V4       V5 V6                V7
    # 1  1 10    92.9144 202.1271     0.00  B 10-Dec-2014 11:46
    # 2  2  5     0.0000 153.3754     0.00    10-Dec-2014 11:52
    # 3  3  5 20380.8867 162.0626 24555.94    10-Dec-2014 11:58
    # 4  4  5 21941.2773 197.9289 25361.44    10-Dec-2014 12:04
    # 
    # $`10,EOP`
    #   V1   V2       V3       V4 V5 V6                V7
    # 1  1 0.98 164702.2 179.8280  0  B 10-Dec-2014 09:46
    # 2  2 1.08      0.0 180.6869  0    10-Dec-2014 09:48
    # 3  3 1.07      0.0 190.6853  0    10-Dec-2014 09:50
    # 4  4 1.32      0.0 163.7527  0    10-Dec-2014 09:52
    # 5  5 1.29      0.0 167.3766  0    10-Dec-2014 09:54
    

    如果您查看源代码,您可以看到,该函数是read.table 的基本包装器,它还有一些其他行来帮助确定每轮read.table 要跳过的行数。


    显然,将您的“chunkID”参数更改为代表您的表名实际是什么:-)

    【讨论】:

    • 太好了,现在我遇到了将所有这些导出回多个文本文件的问题,所以我的同事可以使用 excel 导入这些数据。我知道,我知道,EXCEL=gross,但他们还没有得到启发。
    • @MadmanLee,这是一个列表,所以你可以使用 lapply(your-list, write.csv, otherargumentstowritecsv) 之类的东西。
    【解决方案2】:

    你不能用我知道的任何基本 R 函数来做到这一点。您可以做的是读取所有数据,然后使用正则表达式(或其他内容)找到断点,然后解析每个块。例如

    lines <- readLines("data.csv")
    group <- cumsum(grepl("^\\d+,\\w+$", lines))  #number,character
    
    lapply(split(lines, group), function(x) read.table(text=x[-1], sep=","))
    

    得到

    $`1`
      V1 V2         V3       V4       V5 V6                V7
    1  1 10    92.9144 202.1271     0.00  B 10-Dec-2014 11:46
    2  2  5     0.0000 153.3754     0.00    10-Dec-2014 11:52
    3  3  5 20380.8867 162.0626 24555.94    10-Dec-2014 11:58
    4  4  5 21941.2773 197.9289 25361.44    10-Dec-2014 12:04
    
    $`2`
      V1   V2       V3       V4 V5 V6                V7
    1  1 0.98 164702.2 179.8280  0  B 10-Dec-2014 09:46
    2  2 1.08      0.0 180.6869  0    10-Dec-2014 09:48
    3  3 1.07      0.0 190.6853  0    10-Dec-2014 09:50
    4  4 1.32      0.0 163.7527  0    10-Dec-2014 09:52
    5  5 1.29      0.0 167.3766  0    10-Dec-2014 09:54
    

    【讨论】:

    • 非常好,我正要发布类似的内容,使用readChar 而不是readLines。 +1
    猜你喜欢
    • 2012-04-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多