我需要从URL读取.txt文件,但希望跳过行直到具有特定值的行。网址为https://fred.stlouisfed.org/data/HNOMFAQ027S.txt,数据采用以下格式:
"
...(行数)
...(行数)
...(行数)
日期值
1945-01-01 144855
1946-01-01 138515
1947-01-01 136405
1948-01-01 135486
1949-01-01 142455
"
我想跳过所有行,直到" DATE // VALUE"并开始从此行开始导入数据(包括" DATE // VALUE")。有没有办法用data.table的fread() - 或任何其他方式,例如使用dplyr?
非常感谢您的努力和时间!
最佳,
下进行。
答案 0 :(得分:2)
以下是使用start()
,dplyr和stringr处理字符串从这些文本文件中提取信息的方法。
readr::read_lines
我使用library(tidyverse)
library(stringr)
df <- data_frame(lines = read_lines("https://fred.stlouisfed.org/data/HNOMFAQ027S.txt")) %>%
filter(str_detect(lines, "^\\d{4}-\\d{2}-\\d{2}")) %>%
mutate(date = str_extract(lines, "^\\d{4}-\\d{2}-\\d{2}"),
value = as.numeric(str_extract(lines, "[\\d-]+$"))) %>%
select(-lines)
df
#> # A tibble: 286 x 2
#> date value
#> <chr> <dbl>
#> 1 1945-10-01 1245
#> 2 1946-01-01 NA
#> 3 1946-04-01 NA
#> 4 1946-07-01 NA
#> 5 1946-10-01 1298
#> 6 1947-01-01 NA
#> 7 1947-04-01 NA
#> 8 1947-07-01 NA
#> 9 1947-10-01 1413
#> 10 1948-01-01 NA
#> # ... with 276 more rows
过滤了您要保留的所有行,然后使用stringr::str_detect
和正则表达式从字符串中提取出您想要的信息。
答案 1 :(得分:2)
将fread与unix工具结合使用:
> fread("curl -s https://fred.stlouisfed.org/data/HNOMFAQ027S.txt | sed -n -e '/^DATE.*VALUE/,$p'")
DATE VALUE
1: 1945-10-01 1245
2: 1946-01-01 .
3: 1946-04-01 .
4: 1946-07-01 .
5: 1946-10-01 1298
---
282: 2016-01-01 6566888
283: 2016-04-01 6741075
284: 2016-07-01 7022321
285: 2016-10-01 6998898
286: 2017-01-01 7448792
>
答案 2 :(得分:1)
使用:
file.names <- c('https://fred.stlouisfed.org/data/HNOMFAQ027S.txt',
'https://fred.stlouisfed.org/data/DGS10.txt',
'https://fred.stlouisfed.org/data/A191RL1Q225SBEA.txt')
text.list <- lapply(file.names, readLines)
skip.rows <- sapply(text.list, grep, pattern = '^DATE\\s+VALUE') - 1
# option 1
l <- Map(function(x,y) read.table(text = x, skip = y), x = text.list, y = skip.rows)
# option 2
l <- lapply(seq_along(text.list), function(i) fread(file.names[i], skip = skip.rows[i]))
会为您提供data.frame&#39; s(选项1)或data.table&#39; s(选项2)的列表。