1

カンマ区切りのテキストを含む文字列があります。カンマ区切りのテキストはExcelの.csvファイルから取得されるため、7列幅のデータが数百行あります。このファイルの行の例は次のとおりです。

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)内で一度に1行ずつ出力することです。したがって、最初の出力はであり、次の出力はでFor Each line in linesあると予想します。最後の出力がDate,Open,High,Low,Close,Volume,Adj Close2013-02-05,761.13,771.11,759.47,765.74,1870700,765.742004-08-19,100.00,104.06,95.96,100.34,22351900,100.34

4

3 に答える 3

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
于 2013-02-01T17:14:21.950 に答える
1

私はそれを-に分割しますList(of string())-各行はリストの新しいエントリです。

次に、リストをループして、Value(0)を確認します。 If Value(0) = MyValue, then Open = Value(1)

于 2013-02-01T16:54:06.940 に答える
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
于 2013-02-01T17:08:49.973 に答える