2015-06-24 3 views
1

Следующий код, который я прочитал в файле DataGridView файл с разделителями табуляции. Он отлично работает, но есть несколько проблем, которые я не совсем точно понимаю.Чтение закладки с разделителем в DataGridView

Dim query = From line In IO.File.ReadAllLines("C:\Temp\Temp.txt") 
Let Data = line.Split(vbTab) 
Let field1 = Data(0) 
Let field2 = Data(1) 
Let field3 = Data(2) 
Let field4 = Data(3) 

DataGridView1.DataSource = query.ToList 
DataGridView1.Columns(0).Visible = False 

Как мне добавить поля (столбцы) в зависимости от количества полей в строке заголовка? В строке заголовка в настоящее время содержится 110 полей, которые мне не хотелось бы определять аналогично Let field1 = Data(0)

Мне также нужно пропустить строку заголовка и отображать только строки после этого.

Есть ли лучший способ справиться с этим, чем то, что я сейчас делаю?

+1

OleDB прочтет этот тип файла, создать DataTable, который можно привязать к DGV – Plutonix

ответ

2

Существует несколько инструментов для анализа этого типа файлов. Один из них - OleDB.

Я не могу понять, как работает (удаленный) ответ, потому что HDR=No; сообщает текстовому драйверу, что первая строка не содержит имен столбцов. Но это иногда игнорируется после того, как он считывает первые 8 строк без IMEX.

Однако FMT=Delimited\""" выглядит так, как будто он был скопирован из ответа C#, потому что VB не использует \, чтобы избежать символов. Также похоже, что он смешивает разделитель столбцов (запятая или табуляция в этом случае) и разделитель текста (обычно ")

Если файл имеет разделитель табуляции, то правильным значением будет FMT=TabDelimited. Я предполагаю, что поля представляют собой текст, ограниченный кавычками (например, "France" "Paris" "2.25"), а OleDB измельчает данные кавычками, а не вкладками, чтобы случайно получить тот же результат.

Правильная строка ACE будет:

Dim connstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Temp';Extended Properties='TEXT;HDR=Yes;FMT=TabDelimited';" 

Используя только строку соединения будет импортировать каждый подал в виде строки. Вы также можете преобразовать данные OleDB в любой тип данных, который он предназначен, чтобы вам не пришлось мутировать ваш код множеством Convert.ToXXXX, чтобы преобразовать данные String в любой.

Для определения файла необходимо использовать Schema.INI. Это заменяет большую часть расширенных свойств в строке соединения, оставляя только Extended Properties='TEXT';" (что означает использование драйвера TEXT). Создание имени файла Schema.INI в той же папке, что и данные:

[Capitals.txt]
ColNameHeader = True
CharacterSet = 437
Format = TabDelimited
TextDelimiter =»
DecimalSymbol =
. CURRENCYSYMBOL = $
Col1 = "Страна" Текст Ширина 254
Col2 = "Город Столиц" Текст Ширина 254
Col3 =» Population»Single
COL4 = "фальшивый" Integer

Один Schema.INI может содержать макет для многих файлов. Каждый файл имеет свой собственный раздел под названием с именем файла (например,[FooBar.CSV], [Capitals.txt] и т.д.)

Большинство записей должны быть понятны, но FORMAT определяет разделитель столбцов (TabDelimited, CSVDelimited или пользовательские Delimited(;)); TextDelimiter - символ используется для помещения данных столбца, когда он может содержать пробелы или другие специальные символы. Такие вещи, как CurrencySymbol, позволяют вам использовать внешний символ и могут быть опущены.

В списках ColN= вы можете переименовать столбцы и указать тип данных. Это может оказаться утомительным для ввода более 100 столбцов, однако, вероятно, это будет главным образом копирование и вставка. Как только это будет сделано, вы всегда будете иметь его и сможете легко использовать типизированные данные.

Вам не нужно указывать имена столбцов/размер/тип использовать Schema.ini Если файл содержит имена столбцов в качестве первой строки (ColNameHeader = True), вы можете использовать схему, чтобы просто указать различные параметры в понятном и понятном виде, а не сжимать их в строку соединения.

OleDB ищет Schema.ini в той же папке, что и файл импорта, а затем ищет раздел подшипником точное название «таблицы», используемый в SQL:

' form level DT var 
Private capDT As DataTable 

' procedure code to load the file: 
Dim connstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Temp';Extended Properties='TEXT';" 
Dim SQL = "SELECT * FROM Capitals.txt" 

capDT = New DataTable 

' USING will close and dispose of resources 
Using cn As New OleDbConnection(connstr), 
      cmd As New OleDbCommand(SQL, cn) 

    cn.Open() 
    Using da As New OleDbDataAdapter(cmd) 
     da.Fill(capDT) 
    End Using 

End Using ' close and dispose 

DataTable является теперь готов к использованию. Если перебирать столбцы, вы можете видеть, что они соответствуют типу, указанному в схеме:

' display data types 
For n As Int32 = 0 To capDT.Columns.Count - 1 
    Console.WriteLine("name: {0}, datatype: {1}", 
         capDT.Columns(n).ColumnName, 
         capDT.Columns(n).DataType.ToString) 
Next 

Выход:

Имя: Страна, тип данных: System.String
имя: Город столиц, тип данных : System.String
название: Население, тип данных: System.Single
имя: Поддельные, тип данных: System.Int32

Смотрите также:

  • Schema.INI для большинства правовых установок
  • Code Page Identifiers для значения использовать для CharacterSet
+0

Я должен удалить свой ответ, тогда что-то сломалось. Да, я нашел раздел C#, который, казалось, работал отлично весь день сегодня. Хорошо, спасибо за помощь, я посмотрю на это завтра на работе. – Muhnamana

+0

Ну, это прослушивало меня достаточно, я вошел в систему из дома, чтобы работать, конечно, у меня был файл схемы, который был удален, удалил его по ошибке. Однако вы все еще чувствуете, что то, что я разместил, было неверным? – Muhnamana

+0

В схеме, которая у меня была, была строка 1 = [Temp.txt], строка 2 = Формат = Разграничено (\t). Я, должно быть, создал это, используя другой код, который не работал. – Muhnamana

Смежные вопросы