2013-08-04 2 views
0

J'importe un fichier csv dans une datatable qui, malheureusement, met mes données dans des colonnes de chaîne même celles avec des chiffres.Convertir le type d'une colonne en datable

donc je dois convertir le format de certaines colonnes (à moins d'une autre manière) en datetime, entier ou double raison pour laquelle je l'ai écrit le code suivant:

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 

Mais il y a des cellules vides qui le format de chaîne est vbnullstring. Ma question est est-il un moyen plus facile que mon code et sinon est-il un moyen plus rapide que la conversion des cellules vides alors de cette façon:

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 

Parce que cela est très très lent.

Merci

Répondre

1

Lors de l'importation du fichier csv si vous connaissez déjà les types de colonnes au préalable, alors vous devriez faire une table avec les colonnes, puis remplir les données. Le clonage d'une table, puis remplir de nouveau les données est très lent, surtout si les données est grande

Vous pouvez consulter les documents suivants 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

J'ai essayé votre solution mais j'obtiens une exception de cast lors de l'import du fichier csvfile dans le datatable. L'exception indique que le type attendu est Double au lieu de String. Mon code pour l'importation est la suivante: 'Bien que csvCopy.ReadNextRecord() Dim csvRow Comme DataRow = DataTable.NewRow Pour i = 0 à csvCopy.FieldCount - 1 csvRow (i) = csvCopy (i) Suivant datatable .Rows.Add (csvRow) Fin While' Et il se fige sur 'csvRow (i) = csvCopy (i)' – Rave

+1

Vous le faites exactement faux comme l'op dans le lien. S'il vous plaît utiliser la méthode indiquée dans la réponse dans cette page – puneet

+0

Merci cela a fonctionné parfaitement – Rave

0

Utilisez le dessous du code pour convertir le type de données d'une colonne 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; 
    } 
} 

Ajouter une colonne existante DataTable & Mise à jour des données à la nouvelle colonne qui vous voulez changer le type de données.

Questions connexes