2013-08-04 4 views
0

Я импортирую файл csv в datatable, который, к сожалению, помещает мои данные в строковые столбцы, даже те с цифрами.Преобразование типа столбцов в datatable

Так что я должен преобразовать формат некоторых столбцов (если есть другой способ) в DateTime, целое число или два раза, почему я написал следующий код:

Public Sub ChangeFieldType(ByRef dataTable As DataTable, ByVal fieldIndex As Integer, ByVal newType As Type) 
    Dim newDataTable As DataTable = dataTable.Clone 

    newDataTable.Columns(fieldIndex).DataType = newType 
    For Each row As DataRow In dataTable.Rows 
     newDataTable.ImportRow(row) 
    Next 
    dataTable = newDataTable 
End Sub 

Но есть некоторые пустые клетки, которые в Строковый формат - vbnullstring. Мой вопрос есть более простой способ, то мой код, и если не существует ли более быстрый способ, чем преобразование пустых ячеек, то таким образом:

Public Sub ChangeFieldType(ByRef dataTable As DataTable, ByVal fieldIndex As Integer, ByVal newType As Type) 
    Dim newDataTable As DataTable = dataTable.Clone 

    newDataTable.Columns(fieldIndex).DataType = newType 
    For Each row As DataRow In dataTable.Rows 
     If row(fieldIndex) = vbNullString Then 
      row(fieldIndex) = Nothing 
     End If 
     newDataTable.ImportRow(row) 
    Next 
    dataTable = newDataTable 
End Sub 

Потому что это очень-очень медленно.

Благодаря

ответ

1

При импорте файла CSV, если вы уже знаете, типы столбцов заранее, то вы должны сделать таблицу с теми столбцами, а затем заполнить данные. Клонирование таблицы, а затем снова заполняя данные очень медленный процесс, особенно если данные велик

Вы можете обратиться к следующему http://social.msdn.microsoft.com/Forums/windows/en-US/34b6a1e8-5103-42a3-aa45-cdc0cea461f2/importing-csv-file-to-datatable-problem-with-converting-data-type

+0

Я пробовал ваше решение, но я получаю исключение литья во время импорта csvfile в datatable. Исключение говорит о том, что ожидаемым типом является Double вместо String. Мой код для импортирования следующий: 'Хотя csvCopy.ReadNextRecord() Dim csvRow As DataRow = datatable.NewRow Для я = 0 Для csvCopy.FieldCount - 1 csvRow (я) = csvCopy (I) Следующая DataTable .Rows.Add (csvRow) End While' И он зависает на 'csvRow (i) = csvCopy (i)' – Rave

+1

Вы делаете это в точности как op в ссылке. Пожалуйста, используйте метод, показанный в ответе на этой странице – puneet

+0

Спасибо, что он отлично работал – Rave

0

использовать следующий код для преобразования типа данных столбца в DataTable

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     DataTable table = GetTable(); 

     DataColumn dc = new DataColumn("MyDate", Type.GetType("System.String")); 
     table.Columns.Add(dc); 

     foreach (DataRow row in table.Rows) 
     { 
      row["MyDate"] =Convert.ToDateTime(row["Date"].ToString()).ToString("dd-MM-yyyy"); 
     } 

     GridView1.DataSource = table; 
     GridView1.DataBind(); 
    } 



    static DataTable GetTable() 
    { 
     // Here we create a DataTable with four columns. 
     DataTable table = new DataTable(); 
     table.Columns.Add("ID", typeof(int)); 
     table.Columns.Add("SortName", typeof(string)); 
     table.Columns.Add("FullName", typeof(string)); 
     table.Columns.Add("Date", typeof(DateTime)); 

     // Here we add five DataRows. 
     table.Rows.Add(25, "Geli", "Smruti", DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")); 
     table.Rows.Add(50, "Gelu", "Ramesh", DateTime.Now.AddDays(2).ToString("yyyy-MM-dd")); 
     table.Rows.Add(10, "Nitu", "Mama", DateTime.Now.AddDays(3).ToString("yyyy-MM-dd")); 
     table.Rows.Add(21, "Babu", "Gelu", DateTime.Now.AddDays(4).ToString("yyyy-MM-dd"));   
     return table; 
    } 
} 

Добавление столбца существующей DataTable & Обновление данных на новый столбец, который вы хотите изменить тип данных.

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