0

在将 CSV 文件解析为来自 Azure Blob 的流期间,TextFieldParser 始终会立即到达 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

我也尝试过转换MemoryStreamTextReader

Dim myTextReader As TextReader = New StreamReader(memoryStream)

然后传入myTextReaderTextFieldParser但这也不起作用。

Using Reader As New FileIO.TextFieldParser(myTextReader)

4

1 回答 1

1

我看到这个:

Length 属性的值等于文件大小

和这个:

“位置”属性具有相同的值

这意味着在循环开始时,MemoryStream已经前进到流的末尾。只需设置Position回 0,您应该会处于一个更好的位置。

但是,这里也可能存在另一个问题。该流数据是二进制的,具有一些未知的编码。TextFieldParserText合作。您需要一种方法来提供TextFieldParser有关使用何种编码的信息。

在这种情况下,我推荐一个StreamReader. 此类型继承自TextReader,因此您可以将其与TextFieldParser:

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)

Dim myList As New List(Of MyBusinessObject)
For Each blb In BlobList

    'Several constructor overloads allow you to specify the encoding here
    Using blobData As New StreamReader(New MemoryStream())
        blb.DownloadToStream(blobData.Stream)

        'Fix the position problem
        blobData.Stream.Position = 0

        Using Reader As New FileIO.TextFieldParser(blogData)
            Reader.TextFieldType = FileIO.FieldType.FixedWidth
            Reader.SetFieldWidths(2, 9, 10)
            Dim currentRow As String() = Reader.ReadFields()
            While Not Reader.EndOfData
                Try
                    myList.Add(New GsmXFileRow() With {
                        ' code to read currentRow and add elements to myList
                    })
                    currentRow = Reader.ReadFields()
                Catch ex As FileIO.MalformedLineException
                End Try
            End While
        End Using 
    End Using
Next
于 2017-08-11T21:00:30.870 回答