如何在R中下载CFTC持仓报告HTM文件并转换为表格
解决CFTC持仓报告从
节点转表格的问题
嘿,我明白你现在卡在把CFTC持仓报告的
文本转成表格这一步了,别担心,咱们一步步来搞定它:第一步:提取
标签里的纯文本你已经拿到了XML节点集
tableNodes,首先要把里面的文本内容提取出来,用xmlValue就能轻松搞定:# 提取节点中的纯文本内容 raw_text <- xmlValue(tableNodes[[1]])第二步:清理文本行
这个文本是按行排列的,里面可能混有空行或者多余的说明行,咱们先把这些无效内容过滤掉:
# 按换行符拆分文本成单独行 text_lines <- strsplit(raw_text, "\n")[[1]] # 过滤掉空行和全空白的行 text_lines <- text_lines[text_lines != "" & !grepl("^\\s*$", text_lines)]你可以先打印前几行看看结构:
head(text_lines, 5),这样能帮你确定后面要跳过多少表头行。第三步:把固定宽度文本转成数据框
CFTC的持仓报告是固定宽度格式的,所以用
read.fwf(固定宽度文件读取)最合适。首先你需要确定每一列的宽度——可以通过观察文本的列对齐情况来判断,比如农业持仓报告的列宽度大概是这样(你要根据实际内容调整):# 先把清理后的文本写入临时文件,方便read.fwf读取 temp_file <- tempfile(fileext = ".txt") writeLines(text_lines, temp_file) # 读取固定宽度文件,skip参数是要跳过的表头行数(比如前3行是说明和表头) cftc_data <- read.fwf( temp_file, widths = c(10, 15, 12, 12, 12, 12, 12), # 这里的宽度要根据实际调整! header = FALSE, skip = 3 )第四步:给列命名并转换数据类型
接下来给数据框加上有意义的列名,再把数值列从字符转成数值型(注意要去掉千分位的逗号):
# 给列命名,对应CFTC报告的实际列 colnames(cftc_data) <- c( "Contract_Name", "Noncommercial_Long", "Noncommercial_Short", "Commercial_Long", "Commercial_Short", "Total_Long", "Total_Short" ) # 把数值列转成数值类型(排除第一列合约名称) cftc_data[, -1] <- lapply(cftc_data[, -1], function(x) as.numeric(gsub(",", "", x)))可选:用rvest简化整个流程
如果你觉得XML包用起来有点繁琐,也可以用更简洁的
rvest包来获取文本,步骤更直观:library(rvest) url <- 'https://www.cftc.gov/dea/options/ag_sof.htm' # 直接抓取<pre>标签里的文本 raw_text <- read_html(url) %>% html_element("pre") %>% html_text() # 后面的文本清理、转表格步骤和上面完全一样小提醒
不同类型的CFTC报告(比如期货单独报告、期货+期权合并报告)的列结构和行数可能不一样,所以一定要根据你下载的页面调整
skip的行数和widths的数值哦!内容的提问来源于stack exchange,提问作者Jack Po
相关产品推荐
相关产品推荐

