2015-01-11 4 views
0

Я использую этот код для загрузки формата CSV из Yahoo Finance для определенного тикера. По какой-то причине CSV-файл загружается в той же строке, что и для начала новой строки для повседневной работы в истории котировок акций. Из-за этого я не могу использовать открытый файл для ввода как метод #. Есть идеи? Благодарим вас за любую помощь или предложения.CSV-текст, загружающий все в одну строку вместо новых строк

Public Sub DownloadAllHistorical(ticker As Variant, stdate As Date, endate As Date, freq As String, loc As Variant) 
Dim a, b, c, d, e, f As String 
a = "&a=" & Month(stdate) - 1 
b = "&b=" & Day(stdate) 
c = "&c=" & Year(stdate) 
d = "&d=" & Month(endate) - 1 
e = "&e=" & Day(endate) 
f = "&f=" & Year(endate) 
g = "&g=" & freq 

Dim URL As String 
URL = "http://ichart.finance.yahoo.com/table.csv?s=" & _ 
     ticker & _ 
     a & b & c & _ 
     d & e & f & _ 
     g & "&ignore=.csv" 

Dim http As MSXML2.XMLHTTP 
Set http = New MSXML2.XMLHTTP 
http.Open "GET", URL, False 
http.send 
URL = http.responseBody 
If http.Status = 200 Then 
    Set ostream = CreateObject("ADODB.Stream") 
    ostream.Open 
    ostream.Type = 1 
    ostream.Write http.responseBody 
    ostream.SaveToFile loc & ticker & ".csv", 2 ' 1 = no overwrite, 2 = overwrite 
    ostream.Close 
End If 

Set ostream = Nothing 
Set http = Nothing 
End Sub 

ответ

2

Это не очень хороший вопрос. Хороший вопрос, вероятно, был бы получен в течение нескольких минут.

Вы можете предположить, что любой, кто посещает страницу Excel-VBA Stack Overflow с намерением ответить на вопросы, знаком с Excel VBA. Вы не должны предполагать, что они знакомы с чем-либо еще. Вы предполагаете, что потенциальный ответчик знаком со словом «тикер» и знает параметры загрузки Yahoo.

Ваше название: «CSV-текст, загружающий все в одну строку вместо новых строк». Вы говорите: «По какой-то причине CSV-файл загружается в той же строке, что и предполагалось, чтобы начать новую строку для повседневной работы в истории цен на акции». На самом деле название и заявление не соответствуют действительности.

Запустив код и посмотрев на сохраненный файл, проблема очевидна. Возможно, если бы я подумал о вашем желании использовать оператор Input #, я бы сразу догадался о причине.

Некоторые функции Windows возвращаются к дням MS-DOS. В частности, NotePad и Input # работают только с текстовыми файлами в стиле MS-DOS. В те дни устройства вывода работали как пишущие машинки: CR означало возврат к началу текущей строки, а LF означало продвижение на одну строку. Все текстовые файлы использовали CRLF (возврат каретки, а затем Line feed) в качестве разделителя строк, потому что это означало, что они могут выводиться непосредственно на принтеры, пульты и т. Д.

Большинство частей Windows по-прежнему используют CRLF в качестве разделителя строк по умолчанию, но будет принять LF, который является стандартом везде. NotePad и Input # нет.

Если вы открыли загруженный файл текстовым редактором, который принимает LF в качестве разделителя, вы бы увидели, что детали для каждого дня находятся в отдельной строке. Возможно, вы и не знали, почему, но вы не задали бы такой вводящий в заблуждение вопрос.

Что вы должны сделать?

Выбор 1

Добавить что-то вроде этого в рутину:

Dim InxLine As Long 
Dim Line() As String 

Line = Split(http.responseText, vbLf) 
For InxLine = 0 To UBound(Line) 
    Debug.Print Line(InxLine) 
Next 

Этот код просто выходной каждую строку в окне Immediate. Вам нужно будет заменить Debug.Print Line(InxLine) на соответствующий код для обработки строк.

Выбор 2

Если вы хотите сохранить файл CSV, вы можете сохранить существующую рутина без изменений и добавить что-то вроде этого:

Sub TestOpen() 

    Dim WbkThis As Workbook 

    Set WbkThis = ThisWorkbook 

    Workbooks.Open ("C:\Users\Tony\Desktop\goog.csv") 

    ' goog.csv is now the active workbook which have a single worksheet named "goog" 
    Sheets("goog").Move After:=WbkThis.Sheets(WbkThis.Worksheets.Count) 
    ' because the only sheet within workbook goog.csv has been removed, the workbook is 
    ' automatically closed. 

End Sub 

Я скачал файл размером CSV для Google, чтобы мой рабочий стол. Этот макрос открывает этот CSV-файл в качестве рабочей книги и перемещает рабочий лист, содержащий данные, в книгу, содержащую макрос. Рабочий лист «goog» готов к обработке по мере необходимости.

Choice 3

Если это действительно важно, чтобы процедура создания файла, который использует CRLF в качестве терминатора строки:

Добавьте следующий к существующей процедуре после загрузки и перед записью в диск:

Dim FileText As String 
FileText = Replace(http.responseText, vbLf, vbCr & vbLf) 

Заменить:

ostream.Type = 1 
ostream.Write http.responseBody 

по:

ostream.Type = 2 
ostream.Writetext FileText 

Это даст файл, NotePad и другие древние программы могут разделить на линии.

+1

Тони, я полностью согласен с тем, что вы упомянули. Оглядываясь назад, я должен был быть более явным. Я искренне благодарю вас за вашу помощь, и я буду помнить об этом в следующий раз. Re, ваш вариант кода 1: инструкция debug.print работает, и, как вы говорите, мне нужно поместить соответствующую строку для обработки строк. Единственный способ, которым я знаю, - использовать открытый файл для метода append; есть способ сделать это, не открывая/закрывая файл, который, очевидно, еще не был сохранен. Я предполагаю, что в основном эти строки должны быть добавлены в файл «в пути». Еще раз, спасибо заранее. – bp123

+0

@ bp123 Я не понимаю. Вы можете создать новый текстовый файл или перезаписать существующий, если вы не хотите добавлять его. Моя проблема: какой файл? Возможно, если бы вы сказали мне свою цель, я мог бы предложить подход. –

+0

Моя цель - загрузить новый файл csv, и код, который я написал выше, делает это, за исключением crlf. Я пытаюсь найти способ сделать это, так как каждый файл сохраняется кодом (сразу несколько файлов). Конечный результат, который я ищу, - это, по сути, загруженный файл csv, который может использоваться другим программным обеспечением с форматированием, которое отображает каждую строку на новой строке - если это имеет смысл. Как и предполагалось, прямо сейчас, когда файл сохраняется и открывается в текстовом редакторе, все это одна строка. – bp123

 Смежные вопросы

  • Нет связанных вопросов^_^