Извлечение нескольких бит данных из файла .txt - PullRequest
0 голосов
/ 14 ноября 2018

После долгого утра я сдался!

У меня есть следующий текстовый файл: StationLog.txt

Содержит следующее:

Version      = 2.0
StationName  = STN67_P70
BeginTime    = 2017-10-06.03:25:00
EndTime      = 2017-10-06.03:55:00
IgnoreNo     = 5000
PumpedVolume = 0

Мне нужно извлечь BeginTime, EndTime и StationName, эти заголовки в порядке, как значения, которые передаются в другой бит кода.

Идея в том, что мне не нужно делать это вручную, так как со временем будет много этих файлов.

Следуя различным другим путеводителям, я дошел до этого:

a <- read.fwf("StationLog.txt", c(37,100), stringsAsFactors=FALSE)
a <- a[grep("=", a$V1), ]
a <- cbind(
  do.call( rbind, strsplit(a$V1, "=\\s+") )

Но ударив немного о стену, любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Если вы прочитали все это в виде многострочной строки:

data:

txt_string <- "Version      = 2.0
StationName  = STN67_P70
BeginTime    = 2017-10-06.03:25:00
EndTime      = 2017-10-06.03:55:00
IgnoreNo     = 5000
PumpedVolume = 0"

stationName<- regmatches(txt_string, gregexpr("StationName\\s+=\\s+\\K\\S+" ,txt_string, perl = T))
beginTime  <- regmatches(txt_string, gregexpr("BeginTime\\s+=\\s+\\K\\S+" ,txt_string, perl = T))
endTime    <- regmatches(txt_string, gregexpr("EndTime\\s+=\\s+\\K\\S+" ,txt_string, perl = T))

do.call(cbind, c(stationName, beginTime, endTime))

#     [,1]        [,2]                  [,3]                 
#[1,] "STN67_P70" "2017-10-06.03:25:00" "2017-10-06.03:55:00"
0 голосов
/ 14 ноября 2018

Альтернативный метод:

# use the filename vs this embedded example
station_info <-   readLines(textConnection("Version      = 2.0
StationName  = STN67_P70
BeginTime    = 2017-10-06.03:25:00
EndTime      = 2017-10-06.03:55:00
IgnoreNo     = 5000
PumpedVolume = 0"))

база:

as.list(sapply(
  strsplit(station_info, split = "[[:space:]]*=[[:space:]]*"),
  function(x) setNames(x[2], x[1])
)) -> station_info

str(station_info, 1)
## List of 6
##  $ Version     : chr "2.0"
##  $ StationName : chr "STN67_P70"
##  $ BeginTime   : chr "2017-10-06.03:25:00"
##  $ EndTime     : chr "2017-10-06.03:55:00"
##  $ IgnoreNo    : chr "5000"
##  $ PumpedVolume: chr "0"

tidyverse:

library(tidyverse)

# use the filename vs this embedded example
station_info <-   readLines(textConnection("Version      = 2.0
StationName  = STN67_P70
BeginTime    = 2017-10-06.03:25:00
EndTime      = 2017-10-06.03:55:00
IgnoreNo     = 5000
PumpedVolume = 0"))

str_split(station_info, pattern = "[[:space:]]*=[[:space:]]*") %>% 
  map(~set_names(.x[2], .x[1])) %>% 
  flatten() %>% 
  str(1)

Оборачивание базовой версии (чтобы избежать зависимостей) в функцию, чтобы вы могли повторно использовать ее для других станций:

read_station_metadata <- function(path) {

  path <- path.expand(path)
  stopifnot(file.exists(path))

  station_info <- readLines(path, warn = FALSE)

  as.list(sapply(
    strsplit(station_info, split = "[[:space:]]*=[[:space:]]*"),
    function(x) setNames(x[2], x[1])
  ))

}
0 голосов
/ 14 ноября 2018

Основываясь на функции read.table, вы можете использовать аргументы, чтобы сделать то, что вы хотите.

Следующее предложение будет работать, если у вас есть только один = на строку, и если BeginTime, EndTimeи StationName имеют одинаковую запись во всех файлах:

read.table(
  file            ="StationLog.txt",
  header          =FALSE, # No column names
  sep             ="=",   # separator character
  strip.white     =TRUE,  # remove multiple white character
  row.names       =1,     # the first column contains the rownames
  stringsAsFactors=FALSE
)[c("BeginTime", "EndTime", "StationName"), # extract the 3 infos based on their names corresponding to the rownames
  ,drop=FALSE] # keep the data.frame format

И результат:

                             V2
BeginTime   2017-10-06.03:25:00
EndTime     2017-10-06.03:55:00
StationName           STN67_P70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...