Question

I have a string that contains comma delimited text. The comma delimited text comes from an excel .csv file so there are hundreds of rows of data that are seven columns wide. An example of a row from this file is:

2012-10-01,759.05,765,756.21,761.78,3168000,761.78

I want to search through the hundreds of rows by the date in the first column. Once I find the correct row I want to extract the number in the first position of the comma delimited string so in this case I want to extract the number 759.05 and assign it to variable "Open".

My code so far is:

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

Once I can narrow it down to the right row I think something like row.Split(",")(1).Trim) might work.

I've done quite a bit of research but I can't solve this on my own. Any suggestions!?!

ADDITIONAL INFORMATION:

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 

MORE ADDITIONAL INFORMATION:

A more complete picture of my code

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

Right now in the For Each line in lines loop, Debug.WriteLine(line) outputs 2,131 lines:

From

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

All the way to...

2004-08-19,100.00,104.06,95.96,100.34,22351900,100.34

But, what I expect is for Debug.WriteLine(line) to output one line at a time in the For Each line in lines loop. So I would expect the first output to be Date,Open,High,Low,Close,Volume,Adj Close and the next output to be 2013-02-05,761.13,771.11,759.47,765.74,1870700,765.74. I expect this to happen 2,131 times until the last output is 2004-08-19,100.00,104.06,95.96,100.34,22351900,100.34

Was it helpful?

Solution

You could loop through the lines and call String.Split to parse the columns in each line, for instance:

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

However, sometimes CSV isn't that simple. For instance, a cell in a spreadsheet could contain a comma character, in which case it would be represented in CSV like this:

example cell 1,"example, with comma",example cell 3

To make sure you're properly handling all possibilities, I'd recommend using the TextFieldParser class. For instance:

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

OTHER TIPS

I would break it up into a List(of string()) - Each row being a new entry in the list.

Then loop through the list and look at Value(0). If Value(0) = MyValue, then Open = Value(1)

You can use String.Split and this linq query:

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top