如何从逗号分隔的字符串中选择一个值?

时间:2013-02-01 16:50:31

标签: vb.net csv string-split

我有一个包含逗号分隔文本的字符串。逗号分隔文本来自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

3 个答案:

答案 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