Можно ли прочитать две таблицы из одного и того же текстового файла?

Например, если у меня есть текстовый файл (mytext.txt) со следующим текстом:

Table1

    13  3   20  0   0   0   0
    3   10  0   0   0   6   0
    20  0   5   0   0   0   0
    0   0   0   7   20  0   0
    0   0   0   20  19  0   0
    0   0   0   0   0   8   0
    0   0   0   0   0   0   13  

Table2
0
2
10
-5
3
-10
-5

Могу ли я получить их оба и получить две таблицы?

Так что, если я напечатаю свою таблицу данных1, я получу первую таблицу, а если я напечатаю свою таблицу данных 2, я получу вторую таблицу.

Я знаю, что если бы в mytext.txt была только одна таблица, я мог бы сделать что-то вроде:

table1 <- read.table("mytext.txt")

person David    schedule 26.03.2015    source источник


Ответы (2)


1) Предполагая, что входной файл tables.txt, прочитайте строки в Lines и пусть names.ix будут индексами строк, содержащих имена таблиц — эти строки идентифицируются как начинающиеся с символа, который не является минусом или цифра. Затем создайте группирующую переменную grp, которая определяет, к какой таблице принадлежит каждая строка, разделите строки на эти группы и прочитайте каждую группу строк. Это не использует пакеты и может обрабатывать любое количество таблиц в файле.

Lines <- readLines("tables.txt")
names.ix <- grep("^[^-0-9]", Lines)
grp <- Lines[names.ix][ cumsum(seq_along(Lines) %in% names.ix) ]
Read <- function(x) read.table(text = x)
L <- lapply(split(Lines[-names.ix], grp[-names.ix]), Read)

давая:

> L
$Table1
  V1 V2 V3 V4 V5 V6 V7
1 13  3 20  0  0  0  0
2  3 10  0  0  0  6  0
3 20  0  5  0  0  0  0
4  0  0  0  7 20  0  0
5  0  0  0 20 19  0  0
6  0  0  0  0  0  8  0
7  0  0  0  0  0  0 13

$Table2
   V1
1   0
2   2
3  10
4  -5
5   3
6 -10
7  -5

2) Кстати, если вам нужна только первая таблица, то это сделает это:

library(data.table)
fread("tables.txt")
person G. Grothendieck    schedule 26.03.2015
comment
Теперь, если у меня есть следующий текстовый файл: - person David; 01.04.2015

Не напрямую, но вы можете попробовать read.mtable из моего пакета "SOfun", доступного только на GitHub.

Подход похож на подход @G.Grothendieck, но упакован в функцию, поэтому вы можете просто сделать:

read.mtable("tables.txt", chunkId = "Table", header = FALSE)
# $Table1
#   V1 V2 V3 V4 V5 V6 V7
# 1 13  3 20  0  0  0  0
# 2  3 10  0  0  0  6  0
# 3 20  0  5  0  0  0  0
# 4  0  0  0  7 20  0  0
# 5  0  0  0 20 19  0  0
# 6  0  0  0  0  0  8  0
# 7  0  0  0  0  0  0 13
# 
# $Table2
#    V1
# 1   0
# 2   2
# 3  10
# 4  -5
# 5   3
# 6 -10
# 7  -5

Параметр chunkId также может быть регулярным выражением, например `chunkId = "[A-Za-z]+".

person A5C1D2H2I1M1N2O1R2T1    schedule 30.03.2015