Как читать строки с разделителями CRLF из MSXML.ResponseText в VBA/Excel

Большинство примеров, которые я вижу с MSXML, связаны с Javascript или JQuery, но я пишу макрос Excel 2010, который не использует ни того, ни другого.

Моя цель — загрузить файл (как показано ниже) и проанализировать файл CSV среднего размера (от 5 до 15 МБ). В конечном итоге я хочу сохранить данные CSV на вкладке скрытых данных.

Я немного продвинулся с этим примером CSV VBA здесь, но я не знаю, как склеить вывод MSXML.ResponstText с этим образцом.

Вот мой код VBA/Macro

Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
'objHttp.SetRequestHeader "Content-Type", "text/csv"
'objHttp.SetRequestHeader "charset", "gb2312"
Call objHttp.Open("GET", fileURL, False)
Call objHttp.Send("")
'Call MsgBox(objHttp.ResponseText)

Как заставить Excel работать с ResponseText и читать только одну строку за раз?


person halfbit    schedule 06.12.2011    source источник
comment
Вы пробовали Split(objHttp.ResponseText, vbCrLf)?   -  person JimmyPena    schedule 06.12.2011
comment
ps- вы загружаете файл или читаете веб-ответ?   -  person JimmyPena    schedule 06.12.2011
comment
@JP Я загружаю CSV-файл похож на этот - хотя, пожалуйста, извините за шаткие/неверные данные   -  person halfbit    schedule 06.12.2011
comment
Вместо этого я бы использовал API URLDownloadToFile, чтобы сохранить файл локально, а затем просто открыть его, используя собственные методы Excel (см. Ответ @Jean-François Corbett).   -  person JimmyPena    schedule 06.12.2011


Ответы (2)


Я говорю, не смешивайте вещи. Сначала загрузите CSV-файл, а затем прочитайте его.

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

Dim filePath As String
Dim fn As Integer
Dim myLine As String
Dim myParsedLine() As String

filePath = "C:\DatabaseWeeklyStats.csv"

fn = FreeFile()
Open filePath For Input As #fn
Do Until EOF(fn)
    Line Input #fn, myLine
    myParsedLine = Split(myLine, ",")
    ' Line is now parsed. Do stuff.
Loop

Если вы просто хотите вставить весь CSV-файл на новый лист в своей книге, не обязательно предварительно «разбирая» его (т.е. интерпретируя его содержимое), вы можете сделать это:

Dim dbSheet As Worksheet
Dim targetSheet As Worksheet

Workbooks.Open Filename:="C:\DatabaseWeeklyStats.csv", _
    Format:=2 ' use comma delimiters
Set dbSheet = ActiveSheet

Set targetSheet = Workbooks("Book1").Sheets(3) ' wherever you want to move it to

dbSheet.Move After:=targetSheet
' dbSheet is now in your workbook.

' Hide it.
Set dbSheet = ActiveSheet
dbSheet.Visible = xlSheetHidden
person Jean-François Corbett    schedule 06.12.2011
comment
+1 вы также можете включить код, который использует API URLDownloadToFile для захвата CSV-файла, что сделало бы этот ответ полным. - person JimmyPena; 06.12.2011

Dim opener As New FileSystemObject
Dim fContainer

Set fContainer = opener.OpenTextFile("c:\DatabaseWeeklyStats.csv")

Do Until fContainer.AtEndOfStream
    sText = fContainer.ReadLine
    Debug.Print sText
Loop

' Для этого требуется ссылка на Microsoft Scripting Runtime

person Romeo    schedule 06.12.2011
comment
Это помогает, но работает ли это с использованием ServerXMLHTTP.ResponseText или URL-адреса в качестве аргумента для OpenTextFile? Думаю, я попробую это завтра. - person halfbit; 06.12.2011
comment
opener?! fContainer?! Странное имя переменной! Тем не менее, +1 - person Jean-François Corbett; 06.12.2011