2013-05-13 5 views
1

Я пытаюсь заполнить DataGridView данными из файла txt csv или запятой, который пользователь выбирает. Csv загружается в DataGridView, но в определенном столбце, который содержит смесь альфа-или числовых значений, если первые несколько значений являются числовыми, а затем данные переключаются на альфа-символы, они отбрасываются. См. Ниже:Выпавшие данные при загрузке CSV в DataGridView в C# WinForms

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

enter image description here

Здесь я импортировал файл CSV только либо нулем (первое значение должно быть нулевым) или альфа-значения. У него нет проблем.

Похоже, что, возможно, есть какая-то типа данных угадывания происходит, когда он считает, что данные должны быть числовыми и nullfiies что-нибудь еще.

Вот код, я использую, чтобы импортировать CSV:

string conStr = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + Path.GetDirectoryName(loadPath) + ";Extensions=csv,txt"; 
OdbcConnection conn = new OdbcConnection(conStr); 
OdbcDataAdapter da = new OdbcDataAdapter("Select * from [" + Path.GetFileName(loadPath) + "]", conn); 
DataTable dt = new DataTable(loadPath); 
da.Fill(dt); 
csvTable.DataSource = dt; 

Любая помощь приветствуется.

+0

ли установка 'свойство ValueType' (http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcolumn.valuetype.aspx) в' string' на ячейке в вопрос, прежде чем связывать источник данных, сделать разницу? –

+0

Нет, нет разницы. – egdetti

ответ

2

Рассматривали ли вы использование общего анализатора CSV, который будет использовать структуру данных для создания данных?

This - простой в использовании, общий парсер, отлично подходит для плоских файлов, таких как CSV-файлы.

EDIT:

Чтобы развернуть на Jims комментарий здесь является примером использования TextFieldParser в C#. Это обрабатывает только ваши первые 3 поля, но должно быть достаточным примером для того, чтобы увидеть, как это работает.

String myFilePath = @"c:\test.csv"; 
DataTable dt = new DataTable(); 
dt.Columns.Add("HAB_CODE"); 
dt.Columns.Add("SIZE"); 
dt.Columns.Add("COVER"); 

using (var myCsvFile = new TextFieldParser(myFilePath)){ 
    myCsvFile.TextFieldType = FieldType.Delimited; 
    myCsvFile.SetDelimiters(","); 
    myCsvFile.CommentTokens = new[] { "HEADER", "COMMENT", "TRAILER" }; 

    while (!myCsvFile.EndOfData) { 
     string[] fieldArray; 
     try { 
      fieldArray = myCsvFile.ReadFields(); 
      dt.Rows.Add(fieldArray); 
     } 
     catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex) { 
      // not a valid delimited line - log, terminate, or ignore 
      continue; 
     } 
    // process values in fieldArray 
    }  
} 
+0

Или используйте Microsoft.VisualBasic.FileIO.TextFieldParser, который работает достаточно хорошо. http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx –

+0

Согласен, это пример класса, который, я думаю, не должен быть скрыт в библиотеке VB. – Jake1164

+0

Я закончил этот маршрут. Это хорошо работает для меня. Что касается моей проблемы, я нашел [этот пост] (http://stackoverflow.com/questions/8683180/data-error-when-reading-csv-file-in-c-sharp-winforms?rq=1), что объясняет, что OdbcDataAdapter пытается автоматически определить тип столбца. Действительно, моя колонка была напечатана как Int32. – egdetti

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