Azure BLOBからのストリームとしてCSVファイルを解析するとき、TextFieldParserは常にデータを読み込まずにEndOfDataにただちに到達します。同じコードですが、ストリームの代わりに同じ物理ファイルへのパスがあります。 TextFieldParserでストリームからCSVを解析すると、常にEndOfDataに到達します
Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse(AzureStorageConnection)
Dim blobClient As CloudBlobClient = storageAccount.CreateCloudBlobClient()
Dim BlobList As IEnumerable(Of CloudBlockBlob) = blobClient.GetContainerReference("containername").ListBlobs().OfType(Of CloudBlockBlob)
For Each blb In BlobList
Dim myList As New List(Of MyBusinessObject)
Using memoryStream = New MemoryStream()
blb.DownloadToStream(memoryStream)
Using Reader As New FileIO.TextFieldParser(memoryStream)
Reader.TextFieldType = FileIO.FieldType.FixedWidth
Reader.SetFieldWidths(2, 9, 10)
Dim currentRow As String()
While Not Reader.EndOfData
Try
currentRow = Reader.ReadFields()
myList.Add(New GsmXFileRow() With {
' code to read currentRow and add elements to myList
})
Catch ex As FileIO.MalformedLineException
End Try
End While
End Using
End Using
Next
は、私はまた、
TextFieldParser
に
myTextReader
を渡し、その後
TextReader
Dim myTextReader As TextReader = New StreamReader(memoryStream)
とにMemoryStream
を変換しようとしたが、これはどちらか動作しません。
Lengthプロパティの値が等しいファイルサイズ
と、この:
Using Reader As New FileIO.TextFieldParser(myTextReader)
には、ブレークポイントに入れて、あなたの 'memoryStream'は、あなたが期待するデータを持っていることを確認しましたか?また...あなたのTry/Catchブロックがキャッチされた例外を飲み込んでいるのが分かります。 Try/Catchなしでコードを実行して、エラーがスローされたかどうか確認してください。私は文字列にバイトを変換するエンコーディングの問題は、決して見るMalformedLineExceptionsの結果であると思われる。 –
@JoelCoehoornはい。 'Length'プロパティの値はファイルのサイズと同じです。 'Position'プロパティはストリームがその端に位置することを示唆する値と同じ値を持ちます。例外として、 'Reader.EndOfData'は常に' True'であるため、コードは 'While'内で決して実行されません。 – Megrez7
"位置プロパティに同じ値があります。"あなたの問題があります。それは既に蒸気の終わりまで読み込まれています。あなたは最初に元気に戻す必要があります。そして、あなたがそうするとき、私の答えをチェックしてください。エンコーディングの問題にも対処する必要があるかもしれません。 –