ฉันเอกสารที่นี่รายการของทางเลือกสำหรับการอ่านไฟล์ความกว้างคงที่ในการวิจัยตลอดจนให้เป็นมาตรฐานบางอย่างสำหรับการซึ่งเป็นที่เร็วที่สุด
แนวทางที่ฉันชอบคือการรวมfreadกับstringi; มีการแข่งขันเป็นแนวทางที่เร็วที่สุดและมีประโยชน์เพิ่มเติม (IMO) ในการจัดเก็บข้อมูลของคุณเป็นdata.table:
library(data.table)
library(stringi)
col_ends <- 
  list(beg = c(1, 10, 15, 19, 23, 28, 32, 36,
               41, 45, 49, 54, 58),
       end = c(9, 14, 18, 22, 27, 31, 35,
               40, 44, 48, 53, 57, 61))
data = fread(
  "http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for", 
  header = FALSE, skip = 4L, sep = NULL
  )[, lapply(1:(length(col_ends$beg)),
             function(ii) 
               stri_sub(V1, col_ends$beg[ii], col_ends$end[ii]))
    ][ , paste0("V", c(2, 5, 8, 11)) := NULL]
โปรดทราบว่าfreadโดยอัตโนมัติแถบชั้นนำและต่อท้ายช่องว่าง - strip.white = FALSEบางครั้งนี้เป็นที่ไม่พึงประสงค์ซึ่งในกรณีที่ชุด
เราสามารถเริ่มต้นด้วยเวกเตอร์ของความกว้างของคอลัมน์ได้wwโดยทำ:
ww <- c(9, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5, 4, 4)
nd <- cumsum(ww)
col_ends <-
  list(beg = c(1, nd[-length(nd)]+1L),
       end = nd)
และเราสามารถเลือกคอลัมน์ที่จะยกเว้นได้อย่างมีประสิทธิภาพมากขึ้นโดยใช้ดัชนีเชิงลบเช่น:
col_ends <- 
  list(beg = c(1, -10, 15, 19, -23, 28, 32, -36,
               41, 45, -49, 54, 58),
       end = c(9, 14, 18, 22, 27, 31, 35,
               40, 44, 48, 53, 57, 61))
จากนั้นแทนที่col_ends$beg[ii]ด้วยabs(col_ends$beg[ii])และในบรรทัดถัดไป:
paste0("V", which(col_ends$beg < 0))
สุดท้ายนี้หากคุณต้องการให้อ่านชื่อคอลัมน์แบบเป็นโปรแกรมด้วยเช่นกันคุณสามารถล้างข้อมูลด้วยreadLines:
cols <-
  gsub("\\s", "", 
       sapply(1:(length(col_ends$beg)),
              function(ii) 
                stri_sub(readLines(URL, n = 4L)[4L], 
                         col_ends$beg[ii]+1L,
                         col_ends$end[ii]+1L)))
cols <- cols[cols != ""]
(โปรดทราบว่าการรวมขั้นตอนนี้freadจะต้องมีการสร้างสำเนาของตารางเพื่อลบแถวส่วนหัวและจะไม่มีประสิทธิภาพสำหรับชุดข้อมูลขนาดใหญ่)
     
              
read.fwfเพื่ออ่านข้อมูลที่จัดรูปแบบความกว้างคงที่