我有一个包含逗号分隔文本的字符串。逗号分隔文本来自excel .csv文件,因此有数百行数据为七列宽。此文件中一行的示例是:
2012-10-01,759.05,765,756.21,761.78,3168000,761.78
我想在第一列中按日期搜索数百行。一旦找到正确的行,我想在逗号分隔的字符串的第一个位置提取数字,所以在这种情况下,我想提取数字759.05并将其分配给变量“Open”。
到目前为止我的代码是:
strURL = "http://ichart.yahoo.com/table.csv?s=" & tickerValue
strBuffer = RequestWebData(strURL)
Dim Year As String = 2012
Dim Quarter As String = Q4
If Quarter = "Q4" Then
Dim Open As Integer =
End If
一旦我可以将其缩小到右侧行,我认为像row.Split(“,”)(1).Trim这样的东西可能会起作用。
我做了很多研究,但我不能自己解决这个问题。有什么建议!?!
其他信息:
Private Function RequestWebData(ByVal pstrURL As String) As String
Dim objWReq As WebRequest
Dim objWResp As WebResponse
Dim strBuffer As String
'Contact the website
objWReq = HttpWebRequest.Create(pstrURL)
objWResp = objWReq.GetResponse()
'Read the answer from the Web site and store it into a stream
Dim objSR As StreamReader
objSR = New StreamReader(objWResp.GetResponseStream)
strBuffer = objSR.ReadToEnd
objSR.Close()
objWResp.Close()
Return strBuffer
End Function
更多其他信息:
我的代码的更完整图片
Dim tickerArray() As String = {"GOOG", "V", "AAPL", "BBBY", "AMZN"}
For Each tickerValue In Form1.tickerArray
Dim strURL As String
Dim strBuffer As String
'Creates the request URL for Yahoo
strURL = "http://ichart.yahoo.com/table.csv?s=" & tickerValue
strBuffer = RequestWebData(strURL)
'Create Array
Dim lines As Array = strBuffer.Split(New String() {Environment.NewLine}, StringSplitOptions.None)
'Add Rows to DataTable
dr = dt.NewRow()
dr("Ticker") = tickerValue
For Each columnQuarter As DataColumn In dt.Columns
Dim s As String = columnQuarter.ColumnName
If s.Contains("-") Then
Dim words As String() = s.Split("-")
Dim Year As String = words(0)
Dim Quarter As String = words(1)
Dim MyValue As String
Dim Open As Integer
If Quarter = "Q1" Then MyValue = Year & "-01-01"
If Quarter = "Q2" Then MyValue = Year & "-04-01"
If Quarter = "Q3" Then MyValue = Year & "-07-01"
If Quarter = "Q4" Then MyValue = Year & "-10-01"
For Each line In lines
Debug.WriteLine(line)
If line.Split(",")(0).Trim = MyValue Then Open = line.Split(",")(1).Trim
dr(columnQuarter) = Open
Next
End If
Next
dt.Rows.Add(dr)
Next
现在在For Each line in lines
循环中,Debug.WriteLine(line)
输出2,131行:
这
Date,Open,High,Low,Close,Volume,Adj Close
2013-02-05,761.13,771.11,759.47,765.74,1870700,765.74
2013-02-04,767.69,770.47,758.27,759.02,3040500,759.02
2013-02-01,758.20,776.60,758.10,775.60,3746100,775.60
一直到......
2004-08-19,100.00,104.06,95.96,100.34,22351900,100.34
但是,我期望Debug.WriteLine(line)
在For Each line in lines
循环中一次输出一行。所以我希望第一个输出为Date,Open,High,Low,Close,Volume,Adj Close
,下一个输出为2013-02-05,761.13,771.11,759.47,765.74,1870700,765.74
。我预计这将发生2,131次,直到最后一次输出为2004-08-19,100.00,104.06,95.96,100.34,22351900,100.34
答案 0 :(得分:4)
您可以遍历这些行并调用String.Split
来解析每行中的列,例如:
Dim lines() As String = strBuffer.Split(New String() {Environment.NewLine}, StringSplitOptions.None)
For Each line As String In lines
Dim columns() As String = line.Split(","c)
Dim Year As String = columns(0)
Dim Quarter As String = columns(1)
Next
然而,有时CSV并不那么简单。例如,电子表格中的单元格可以包含逗号字符,在这种情况下,它将以CSV格式表示:
example cell 1,"example, with comma",example cell 3
为了确保您正确处理所有可能性,我建议您使用TextFieldParser课程。例如:
Using parser As New TextFieldParser(New StringReader(strBuffer))
parser.TextFieldType = FieldType.Delimited
parser.SetDelimiters(",")
While Not parser.EndOfData
Try
Dim columns As String() = parser.ReadFields()
Dim Year As String = columns(0)
Dim Quarter As String = columns(1)
Catch ex As MalformedLineException
' Handle the invalid formatting error
End Try
End While
End Using
答案 1 :(得分:1)
我会将其分解为List(of string())
- 每一行都是列表中的新条目。
然后遍历列表并查看Value(0)。
If Value(0) = MyValue, then Open = Value(1)
答案 2 :(得分:1)
您可以使用String.Split
和此linq查询:
Dim Year As Int32 = 2012
Dim Month As Int32 = 10
Dim searchMonth = New Date(Year, Month, 1)
Dim lines = strBuffer.Split({Environment.NewLine}, StringSplitOptions.None)
Dim dt As Date
Dim open As Double
Dim opens = From line In lines
Let tokens = line.Split({","c}, StringSplitOptions.RemoveEmptyEntries)
Where Date.TryParse(tokens(0), dt) AndAlso dt.Date = searchMonth AndAlso Double.TryParse(tokens(1), open)
If opens.Any() Then
open = Double.Parse(opens.First().tokens(1))
End If