CSV 文本全部下载一行而不是换行
CSV text downloading all in one line instead of new lines
我使用此代码从 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
这不是一个好问题。一个好问题可能会在几分钟内得到解答。
您可以假设任何为了回答问题而访问 Stack Overflow Excel-VBA 页面的人都熟悉 Excel VBA。你不应该假设他们熟悉其他任何东西。您假设潜在的回答者熟悉“代码”这个词并且知道雅虎财经下载的参数。
您的标题是“CSV 文本全部在一行而不是新行中下载”。你说:“出于某种原因,CSV 文件在同一行下载,与股价历史记录中的每一天都应该开始一个新行。”其实标题和说法都是不真实的
根据 运行 您的代码并查看保存的文件,问题很明显。也许如果我考虑过您希望使用 Input# 语句,我会立即猜出原因。
Windows 的某些功能可以追溯到 MS-DOS 时代。特别是,NotePad 和 Input# 仅适用于 MS-DOS 样式的文本文件。在那些日子里,输出设备像打字机一样工作:CR 表示 return 到当前行的开头,LF 表示前进一行。所有文本文件都使用 CRLF(Carriage return 后跟 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
此代码只是将每一行输出到立即 Window。您必须用适当的代码替换 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
我已将 Google 的 CSV 文件下载到我的桌面。此宏将该 CSV 文件作为工作簿打开,并将包含数据的工作表移动到包含宏的工作簿。工作表“goog”已准备好按要求处理。
选择 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
这将给出一个记事本和其他古老程序可以拆分成行的文件。
我使用此代码从 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
这不是一个好问题。一个好问题可能会在几分钟内得到解答。
您可以假设任何为了回答问题而访问 Stack Overflow Excel-VBA 页面的人都熟悉 Excel VBA。你不应该假设他们熟悉其他任何东西。您假设潜在的回答者熟悉“代码”这个词并且知道雅虎财经下载的参数。
您的标题是“CSV 文本全部在一行而不是新行中下载”。你说:“出于某种原因,CSV 文件在同一行下载,与股价历史记录中的每一天都应该开始一个新行。”其实标题和说法都是不真实的
根据 运行 您的代码并查看保存的文件,问题很明显。也许如果我考虑过您希望使用 Input# 语句,我会立即猜出原因。
Windows 的某些功能可以追溯到 MS-DOS 时代。特别是,NotePad 和 Input# 仅适用于 MS-DOS 样式的文本文件。在那些日子里,输出设备像打字机一样工作:CR 表示 return 到当前行的开头,LF 表示前进一行。所有文本文件都使用 CRLF(Carriage return 后跟 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
此代码只是将每一行输出到立即 Window。您必须用适当的代码替换 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
我已将 Google 的 CSV 文件下载到我的桌面。此宏将该 CSV 文件作为工作簿打开,并将包含数据的工作表移动到包含宏的工作簿。工作表“goog”已准备好按要求处理。
选择 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
这将给出一个记事本和其他古老程序可以拆分成行的文件。