правильные параметры для загрузки файла с использованием запросов GET API Amazon s3

Я хотел бы иметь возможность загрузить файл .csv из корзины Amazon S3 с помощью R.

Я начал использовать API, описанный здесь http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html

Я использую пакет httr для создания запроса GET, мне просто нужно определить правильные параметры, чтобы иметь возможность загрузить соответствующий файл.

Я установил response-content-type на text/csv, так как я знаю, что это файл .csv, который я надеюсь скачать... но я получаю следующий ответ:

Response [https://s3-zone.amazonaws.com/bucket.name/file.name.csv?response-content-type=text%2Fcsv]
  Status: 200
  Content-type: text/csv
Date and Time,Open,High,Low,Close,Volume
2007/01/01 22:51:00,5683.00,5683.00,5673.00,5673.00,64
2007/01/01 22:52:00,5675.00,5676.00,5674.00,5674.00,17
2007/01/01 22:53:00,5674.00,5674.00,5673.00,5674.00,42
2007/01/01 22:54:00,5675.00,5676.00,5674.00,5676.00,36
2007/01/01 22:55:00,5675.00,5676.00,5675.00,5676.00,18
2007/01/01 22:56:00,5676.00,5677.00,5674.00,5677.00,64
2007/01/01 22:57:00,5678.00,5678.00,5677.00,5677.00,45
2007/01/01 22:58:00,5679.00,5680.00,5678.00,5680.00,30
 .../01/01 22:59:00,5679.00,5679.00,5677.00,5678.00,19

И файл не загружается, и данные, похоже, находятся в ответе... Я могу извлечь строку символов, созданную в ответе, которая представляет данные, и я думаю, что с некоторыми усилиями ее можно преобразовать в data.frame как изначально хотелось, но есть ли лучший способ загрузки данных... прямо из команды GET, а затем использовать read.csv для чтения данных? Я думаю, что это проблемы с параметрами ... просто не уверен, какие параметры нужно установить для загрузки файла.

Если люди предложат преобразовать строку... Это структура строки, которая у меня есть... какие команды мне нужно выполнить, чтобы преобразовать ее в data.frame?

chr "Date and Time,Open,High,Low,Close,Volume\r\n2007/01/01 22:51:00,5683.00,5683.00,5673.00,5673.00,64\r\n2007/01/01 22:52:00,5675."| __truncated__

Спасибо

HLM


person h.l.m    schedule 30.11.2012    source источник
comment
У вас есть код и общедоступный URL-адрес, который можно использовать для тестирования?   -  person IRTFM    schedule 30.11.2012
comment
Я нашел один такой же конструкции. Посмотрите, улучшает ли производительность сочетание чтения непосредственно из значения GET и использования colClasses=.   -  person IRTFM    schedule 01.12.2012


Ответы (2)


Ответ на ваш второй вопрос:

> chr <- "Date and Time,Open,High,Low,Close,Volume\r\n2007/01/01 22:51:00,5683.00,5683.00,5673.00,5673.00,64\r\n"
> read.csv(text=chr)
        Date.and.Time Open High  Low Close Volume
1 2007/01/01 22:51:00 5683 5683 5673  5673     64

Если вам нужна дополнительная скорость для read.csv, попробуйте следующее:

chr <- "Date and Time,Open,High,Low,Close,Volume\r\n2007/01/01 22:51:00,5683.00,5683.00,5673.00,5673.00,64\r\n"
 read.csv(text=chr, colClasses=c("POSIXct", rep("numeric", 5) ) )

Предполагая, что URL-адрес настроен правильно (и нам пока не на чем это проверять), мне интересно, не хотите ли вы взглянуть на значение для GET( ...)$content

Возможно:

infile <- read.csv(text=GET(...)$content, colClasses=c("POSIXct", rep("numeric", 5) ) )

Редактировать:

Это было неправильно, потому что данные выглядят как «сырые» форматы. Нужно преобразовать из необработанного, прежде чем он станет закодированным как текст. Я сделал быстрый поиск в Nabble (в конце концов, он должен быть полезен для чего-то), чтобы найти CSV-файл, который находился в Интернете. Вот что наконец сработало:

read.csv(text=rawToChar( 
                 GET(
                  "http://nseindia.com/content/equities/scripvol/datafiles/16-11-2012-TO-16-11-2012ACCEQN.csv"
                   )[["content"]] ) )
  Symbol Series        Date Prev.Close Open.Price High.Price Low.Price Last.Price Close.Price
1    ACC     EQ 16-Nov-2012     1404.4    1410.95    1410.95   1369.45    1374.95      1378.1
  Average.Price Total.Traded.Quantity Turnover.in.Lacs Deliverable.Qty X..Dly.Qt.to.Traded.Qty
1       1393.62                132921          1852.41           56899                   42.81
person IRTFM    schedule 30.11.2012
comment
Это намного лучше, чем мои попытки заново изобрести велосипед. Скорее всего и быстрее. - person Ari B. Friedman; 30.11.2012
comment
это простое решение на самом деле работает довольно хорошо... но теперь самая большая задержка, по-видимому, связана с преобразованием ответа в строку символов... с использованием content... код, который я сейчас использую, это x <- GET(end.point, add_headers(Date=time.string,Authorization=authorization.string), query=params) y <- read.csv(text=content(x)) какие-либо идеи о том, как чтобы ускорить это? - person h.l.m; 30.11.2012
comment
Я предполагаю, что ответ сервера немного медленнее, чем шаг read.csv. Вы профилировали его с помощью system.time? (Также: известно, что использование colClasses ускоряет все функции read.*.) - person IRTFM; 30.11.2012

Вот один из способов:

library(taRifx) # for stack.list
test <- "Date and Time,Open,High,Low,Close,Volume\r\n2007/01/01 22:51:00,5683.00,5683.00,5673.00,5673.00,64\r\n2007/01/01 22:51:00,5683.00,5683.00,5673.00,5673.00,64\r\n"
stack( sapply( strsplit( test, "\\n" )[[1]], strsplit, split="," ) )

    [,1]                  [,2]      [,3]      [,4]      [,5]      [,6]      
ret "Date and Time"       "Open"    "High"    "Low"     "Close"   "Volume\r"
new "2007/01/01 22:51:00" "5683.00" "5683.00" "5673.00" "5673.00" "64\r"    
new "2007/01/01 22:51:00" "5683.00" "5683.00" "5673.00" "5673.00" "64\r"    

Теперь преобразуйте в data.frame:

testdat <- stack( sapply( strsplit( test, "\\n" )[[1]], strsplit, split="," ) )
rownames(testdat) <- seq(nrow(testdat)) # Because duplicate rownames aren't allowed in data.frames
colnames(testdat) <- testdat[1,]
testdat <- testdat[-1,]
as.data.frame(testdat)
        Date and Time    Open    High     Low   Close Volume\r
2 2007/01/01 22:51:00 5683.00 5683.00 5673.00 5673.00     64\r
3 2007/01/01 22:51:00 5683.00 5683.00 5673.00 5673.00     64\r
person Ari B. Friedman    schedule 30.11.2012
comment
Вместо этого вы можете разделить на "\\r\\n", если он будет возвращать окончания строк Windows, как в примере. - person Ari B. Friedman; 30.11.2012
comment
Хм, спасибо за это, есть ли способ быстро удалить \r бит? ... но в любом случае файл довольно большой > 75 МБ, и поэтому данные преобразуются из символа в данные. Кадр, подобный этому, кажется, занимает много времени ... .so это не идеальное решение на данный момент, учитывая, что данные s3 уже были загружены в виде файла csv... я все еще надеюсь, что значения параметров скорректируют запрос API, чтобы просто загрузить данные. - person h.l.m; 30.11.2012
comment
Замените strsplit( test, "\\n" ) на strsplit( test, "\\r\\n" ) или просто `gsub( \\r, , test) перед запуском любого другого кода. Я не уверен, что вы подразумеваете под просто загрузкой данных, поскольку мне кажется, что он дал вам данные в форме, разделенной запятыми. - person Ari B. Friedman; 30.11.2012
comment
возможно, мне следовало сказать, просто загрузите файл, а не получайте данные в форме, разделенной запятыми... из запроса на получение... - person h.l.m; 30.11.2012