OleDbDataAdapter - чтение файла с разделителями табуляции

(Мне не нужны альтернативы OleDbDataAdapter.)

Код ниже находит и читает файл нормально, но DGV имеет четыре столбца (как и ожидалось), но все строки данных содержат только текст в первом столбце.

    Dim sDir As String = "c:\temp\"
    Dim sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDir & ";Extended Properties='text;HDR=Yes;FMT=TabDelimited';"
    Dim dt As New DataTable()
    Using adapt As New OleDbDataAdapter(String.Format("SELECT TOP 100 * FROM robo.txt"), sConn)
        adapt.Fill(dt)
    End Using
    DataGridView1.DataSource = dt

Я думаю, что расширенные свойства будут единственным требованием. Я пытался добавить Schema.ini безрезультатно - я не думаю, что он даже читается, поскольку заголовки столбцов никогда не соответствуют схеме.

Строка заголовка в наиболее успешном проходе использовала запятые в качестве разделителя - в результате получилось четыре столбца с именами собственными, но табуляция разделила все данные в Col1. Если я использую вкладки в строке заголовка, я получаю некоторые системные назначенные столбцы (3), которые соответствуют строке данных с двумя запятыми.

Что я делаю не так?


Вот первые несколько строк с заменой символа табуляции на <tab> . С тех пор я заметил, что у меня есть дополнительный столбец в данных. Исправление строки заголовка ниже не решило проблему — все данные сбрасываются в первое поле.

Использование разделителя табуляции в заголовке вместо запятых приведет к тому, что весь текст заголовка и данные будут сброшены в первое поле.

col1,state,col3,size,path
<tab>          same<tab><tab>  102912<tab>\\APCD04T\Data\Thumbs.db
<tab>          same<tab><tab>   22016<tab>\\APCD04T\Data\APCD Topical Info\APCD_Boards&Committees_List.doc
<tab>          same<tab><tab>   4.3 m<tab>\\APCD04T\Data\APCD Topical Info\LOSSAN-LAtoSLORailCorridorStrategicPlan.pdf

person rheitzman    schedule 02.09.2015    source источник
comment
можете ли вы отредактировать свой пост, чтобы показать первые 2-3 строки читаемого файла   -  person Ňɏssa Pøngjǣrdenlarp    schedule 02.09.2015


Ответы (1)


Узнал несколько вещей, пытаясь загрузить журнал RoboCopy в журнал DataTable с помощью OLEDB.

  • файл журнала должен иметь расширение .txt или .csv (или ?), .log не работает.
  • Schema.ini, по-видимому, необходим для журнала robocopy с разделителями табуляции, в любом случае он подходит для определения столбца.
  • Datagridview занимает много времени, чтобы отобразить 30 МБ данных, поэтому я использовал фильтры.
  • Я позаимствовал код из сети, чтобы создать Schema.ini, как указано ниже.

(Ошибка ТАК: код больше не будет вставляться из Visual Studio. Инструмент кода переключается на другую веб-страницу для Java.)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Cursor = Cursors.WaitCursor
            'http://ss64.com/nt/robocopy.html can suppress header and summary 
            Dim sFile As String = "c:\temp\robo.txt" ' seems to need a .txt or .csv, .log didn't work
            CreateRoboLogSchema(sFile) ' recreates each pass, no needed once things work
            Dim sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & IO.Path.GetDirectoryName(sFile) & ";Extended Properties='text';"
            ' use Schema.ini for: HDR=Yes;FMT=TabDelimited' and column definitions
            Dim dt As New DataTable()
            Dim SQL As String = "SELECT * FROM " & IO.Path.GetFileName(sFile)
            'SQL &= " WHERE State <> 'Same'"
            Using adapt As New OleDbDataAdapter(SQL, sConn)
                adapt.Fill(dt)
            End Using
            Debug.Print("|" & dt.Rows(0)(1) & "|") ' show import trimmed leading spaces (trims trailing too)
            ' DGV slow to load large files, use filter to display target rows
            Dim dv As New DataView(dt)
            dv.RowFilter = "State <> 'Same'" ' not case sensitive
            DataGridView1.DataSource = dv
            DataGridView1.Columns(0).Visible = False
            DataGridView1.AutoResizeColumns()
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            'Cursor=Cursors.Default
        End Try
    End Sub
    Private Function CreateRoboLogSchema(ByVal strFileName As String) As Boolean
        ' edit http://www.vb-tips.com/CSVDataSet.aspx
        Dim ascii As System.Text.Encoding = System.Text.Encoding.ASCII
        Dim swSchema As System.IO.StreamWriter = Nothing
        Dim blnReturn As Boolean
        Dim strSchemaPath As String = System.IO.Path.GetFileName(strFileName)
        Try
            strSchemaPath = IO.Path.GetDirectoryName(strFileName) & "\Schema.ini"
            swSchema = My.Computer.FileSystem.OpenTextFileWriter(strSchemaPath, False, ascii)
            Dim strFile As String = System.IO.Path.GetFileName(strFileName)
            swSchema.WriteLine("[" & IO.Path.GetFileName(strFileName) & "]")
            swSchema.WriteLine("ColNameHeader=False")
            swSchema.WriteLine("Format=TabDelimited")
            swSchema.WriteLine("Col1=Value1 Text") ' file specific
            swSchema.WriteLine("Col2=State  Text")
            swSchema.WriteLine("Col3=DirChanges  Text")
            swSchema.WriteLine("Col4=Size  Text")
            swSchema.WriteLine("Col5=Filepath Text")
            'Continue for all fields 
            blnReturn = True
        Catch ex As Exception
            blnReturn = False
        Finally
            If swSchema IsNot Nothing Then
                swSchema.Close()
            End If
        End Try
        Return blnReturn
    End Function
person rheitzman    schedule 04.09.2015