Вот решение на основе Base R с фиксированными полями записи. Мы используем read.fwf()
для чтения нескольких записей ввода, анализируя необходимые данные в строках 1, 3, 4, 5 и 6.
Сначала мы преобразуем входные данные из OP в R объект, чтобы сделать пример воспроизводимым.
fixedText = "Set 1
DVRJ, DVRI, DVRP, DVRR !Parameters
DVRJ = 0.0012150
DVRI = 0.0007576
DVRP = 0.0006010
DVRR = 0.0020851
TSTR, TSPI, TSF, TSM !Temperature
0.00, 659.22, 1241.55, 1721.16
TGDDTR,TGDDPI,TGDDF,TGDDM !GDD above TBD
0.00, 660.52, 1246.67, 1726.62
DASTR , DASPI , DASF , DASM !Duration
0.00, 35.00, 70.00, 100.00
Set 2
DVRJ, DVRI, DVRP, DVRR !Parameters
DVRJ = 0.0012713
DVRI = 0.0007576
DVRP = 0.0005982
DVRR = 0.0021067
TSTR, TSPI, TSF, TSM !Temperature
0.00, 644.65, 1229.76, 1704.44
TGDDTR,TGDDPI,TGDDF,TGDDM !GDD above TBD
0.00, 645.42, 1234.33, 1711.56
DASTR , DASPI , DASF , DASM !Duration
0.00, 35.00, 70.00, 100.00
Set 3
DVRJ, DVRI, DVRP, DVRR !Parameters
DVRJ = 0.0012713
DVRI = 0.0007576
DVRP = 0.0005982
DVRR = 0.0021067
TSTR, TSPI, TSF, TSM !Temperature
0.00, 644.65, 1229.76, 1704.44
TGDDTR,TGDDPI,TGDDF,TGDDM !GDD above TBD
0.00, 645.42, 1234.33, 1711.56
DASTR , DASPI , DASF , DASM !Duration
0.00, 35.00, 70.00, 100.00
"
Далее мы устанавливаем объекты, требуемые в качестве аргументов, для read.fwf()
, включая список «ширин» для чтения данных из 12 строк в файле наблюдения. Отрицательные числа в списке представляют данные, которые не сохранены во фрейме выходных данных.
widthList <- list(c(-14,3,-45),
c(-50),
c(-7,9,-50),
c(-7,9,-50),
c(-7,9,-50),
c(-7,9,-50),
c(-50),
c(-50),
c(-50),
c(-50),
c(-50),
c(-50))
theNames <- c("Set","DVRJ", "DVRI", "DVRP", "DVRR")
Наконец, мы запускаем read.fwf()
, включая аргументы.
options(sicken = 10) # so we can see the 7th decimal place in data
data <- read.fwf(textConnection(fixedText), widths = widthList,
flush=TRUE,col.names = theNames)
... и вывод:
> data
Set DVRJ DVRI DVRP DVRR
1 1 0.0012150 0.0007576 0.0006010 0.0020851
2 2 0.0012713 0.0007576 0.0005982 0.0021067
3 3 0.0012713 0.0007576 0.0005982 0.0021067
>