Чтение и синтаксический анализ нерегулярного и смешанного файла ASCII в R

#r #readlines

#r #строки чтения

Вопрос:

Я все еще новичок в R и прошу прощения, если я не использую правильную терминологию. Я заинтересован в извлечении большого объема данных целевого фонда страхования по безработице из системы прямых онлайн-запросов отчетов казначейства (http://www.treasurydirect.gov/govt/reports/tfmp/tfmp_utf.htm ) и я успешно извлек информацию с помощью readLines .

 ESAA_OCT15 <- readLines('http://www.treasurydirect.gov/govt/reports/tfmp/utf/es/dfiw01015tses.txt')
  

что дает мне диаграмму в виде вектора строк.

Есть ли способ затем проанализировать строки и превратить их во фрейм данных, чтобы я мог, по крайней мере, поместить его в Excel и легко извлечь из него важную информацию? Я уверен, что есть и другой способ сделать это, но отчеты всегда будут отличаться в том, какие разделы бухгалтерского кода включены и сколько отдельных транзакций включено, поэтому я даже не уверен, с чего начать.

Мне нужны следующие элементы: дата, доля / номинал (сумма транзакции в долларах), код транзакции и описание транзакции. Итоговые значения были бы полезны, но ни в коем случае не обязательны.

Когда вы смотрите на это с помощью Excel, это выглядит как введите описание изображения здесь

Ответ №1:

Это поможет вам проанализировать информацию:

 ESAA_OCT15 <- readLines('http://www.treasurydirect.gov/govt/reports/tfmp/utf/es/dfiw01015tses.txt')
# Select lines with /
z = grepl(pattern = "/",x = ESAA_OCT15)
d = trimws(ESAA_OCT15[z])

dates = substr(d,0,10)
sharesPar = substr(d,11,41)
  

Для этого сначала выделяются все строки, содержащие / символ. Это даже вернет заголовки столбцов. Они хранятся в d .

Если вы исследуете d:

 [1] "Effective Date                 Shares/Par  Description Code           Memo Number    Code      Account Number"
 [2] "10/01/2015                 2,313,000.0000  12-10 FUTA RECEIPTS         3305617                 ESAA"          
 [3] "10/01/2015                 3,663,000.0000  12-10 FUTA RECEIPTS         3305618                 ESAA"          
 [4] "10/02/2015                 4,314,000.0000  12-10 FUTA RECEIPTS         3305640                 ESAA"          
 [5] "10/05/2015                 3,512,000.0000  12-10 FUTA RECEIPTS         3305662                 ESAA"
  

Информация аккуратно выровнена. Это означает, что данные каждого столбца заканчиваются в определенной позиции. Чтобы проанализировать это, вы можете использовать substr с помощью start и stop, как показано в моем скрипте.

Конечно, я не завершил все синтаксические анализы, я позволю вам закончить остальное. После анализа каждого столбца создайте data.frame(dates, sharesPar, ...)

Комментарии:

1. Это идеально. Спасибо!

Ответ №2:

Это формат фиксированной ширины, поэтому его следует рассматривать как таковой:

 library(dplyr)
library(readr)

readLines("http://www.treasurydirect.gov/govt/reports/tfmp/utf/es/dfiw01015tses.txt") %>% 
  grep("^  [[:digit:]] /[[:digit:]] ", ., value=TRUE) %>% # grab only the lines with data
  textConnection() %>% 
read.fwf(widths=c(19, 26, 27, 15, 10, 27), skip=7) %>%     # read the columns
  mutate_all(trimws) %>%                                   # clean them up
  type_convert() %>%                                       # you still need to convert the date even with this type conversion
  setNames(c("effective_date", "shares_per",               # add decent colnames
             "trans_descr_code", "memo_num", "location_code", "acct_no"))