如何逐行解析WinHTTP响应:UTF-8编码的CSV?

时间:2013-01-10 07:26:34

标签: vba csv utf-8 httpresponse winhttp

作为我愉快解决问题(Not understanding why WinHTTP does NOT authenticate certain HTTPS resource)的下一步,我需要巧妙地解析获得的CSV。目前我使用以下解决方案:

If HTTPReq.Status = 200 Then
    If FSO.FileExists(CSV_Path) = True Then FSO.DeleteFile (CSV_Path)
    Set FileStream = CreateObject("ADODB.Stream")
    FileStream.Open
    FileStream.Type = 1
    FileStream.Write HTTPReq.responseBody
    FileStream.SaveToFile (CSV_Path)
    FileStream.Close
    ActiveWorkbook.Connections("Redmine Timelog").Refresh
    ActiveSheet.PivotTables("PivotTable_RM").PivotCache.Refresh
End If

也就是说,我将CSV保存到磁盘,然后将其作为数据源链接到Excel。但是,我希望我的Excel书籍能够自给自足,而不需要创建其他文件(原因很明显)。

在我的情况下,解决方案非常简单:在单独的Excel工作表(而不是当前存储的链接CSV)上逐行存储WinHTTP.responseText,然后使用Text to Data Excel转换。但是,我面临以下直接麻烦:

  1. CSV是UTF-8编码的,而原始的WinHTTP响应文本似乎不是。有没有办法用所需的编码来解释它?
  2. 如何将CSV拆分成行?使用Split功能还是其他什么? CSV似乎使用了一些标准的NewLine字符,99%的数据应该没有任何这些字符。
  3. 有许多类似的问题已经解决,但到目前为止我发现VBA没有任何明确和可接受的内容,因此任何帮助都将受到赞赏。提前谢谢!

2 个答案:

答案 0 :(得分:3)

最后,我自己找到了两种解决方案:

  1. 借助ADODB.Stream进行CSV转换为UTF-8(有关详情,请参阅:http://www.motobit.com/tips/detpg_binarytostring/
  2. 使用Text to Data Excel例程
  3. 拆分CSV并进一步解析字符串数组

    以下是代码的相关部分:

    'CSV to UTF-8
    Set FileStream = CreateObject("ADODB.Stream")
    FileStream.Open
    FileStream.Type = 1 'Binary
    FileStream.Write HTTPReq.responseBody
    FileStream.Position = 0
    FileStream.Type = 2 'Text
    FileStream.Charset = "UTF-8"
    CSV_Text = FileStream.ReadText
    FileStream.Close
    'CSV Splitting
    CSV_Strings = Split(Trim(CSV_Text), vbLf)
    ThisWorkbook.Worksheets("RM_Log").Cells.ClearContents
    Set OutputRange = ThisWorkbook.Sheets("RM_Log").Range("A1:A" & UBound(CSV_Strings) + 1)
    OutputRange = WorksheetFunction.Transpose(CSV_Strings)
    OutputRange.TextToColumns Destination:=ThisWorkbook.Sheets("RM_Log").Range("A1"), _
        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
        Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 3), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1)), DecimalSeparator:=".", _
        TrailingMinusNumbers:=True
    

    因此,我的Excel文件现在完全自给自足。希望这对其他人也有帮助。非常感谢所有留下评论的人 - 他们缩小了搜索范围。

答案 1 :(得分:0)

这一行

OutputRange = WorksheetFunction.Transpose(CSV_Strings)

应该是这样的

OutputRange.Formula = WorksheetFunction.Transpose(CSV_Strings)