2015-09-02 5 views
0

(. Мне не нужны альтернативы 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 
+0

Вы можете отредактировать свое сообщение, чтобы показать первые 2-3 строки файла, который читается – Plutonix

ответ

0

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

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

(SO ошибки: код не будет вставлять из 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 
Смежные вопросы