2014-03-06 109 views
0

如何克隆DataTable並將其列和行類型更改爲decimal如何更改DataTable類型?

private static DataTable GetDataTabletFromCSVFile(string csv_file_path) 
{ 
    DataTable csvData = new DataTable(); 
    using (TextFieldParser csvReader = new TextFieldParser(csv_file_path)) 
    { 
     csvReader.SetDelimiters(new string[] { "," }); 
     csvReader.HasFieldsEnclosedInQuotes = true; 
     string[] colFields = csvReader.ReadFields(); 
     foreach (string column in colFields) 
     { 
      DataColumn datecolumn = new DataColumn(column); 
      datecolumn.AllowDBNull = true; 
      csvData.Columns.Add(datecolumn); 
      ; 
     } 
     while (!csvReader.EndOfData) 
     { 
      string[] fieldData = csvReader.ReadFields(); 
      //Making empty value as null 
      for (int i = 0; i < fieldData.Length; i++) 
      { 
       if (fieldData[i] == "") 
       { 
        fieldData[i] = null; 
       } 
      } 
      csvData.Rows.Add(fieldData); 
     } 
    } 

    return csvData; 
} 

回答

0

你必須使用decimal.TryParse到字符串解析到decimal並使用正確的列式。然後你可以使用DataRow.SetField擴展支持可空類型:

foreach (string column in colFields) 
{ 
    DataColumn datacolumn = new DataColumn(column, typeof(decimal)); 
    datacolumn.AllowDBNull = true; 
    csvData.Columns.Add(datacolumn); 
} 
while (!csvReader.EndOfData) 
{ 
    string[] fieldData = csvReader.ReadFields(); 
    DataRow addedRow = csvData.Rows.Add(); 
    for (int i = 0; i < fieldData.Length; i++) 
    { 
     decimal value; 
     if(decimal.TryParse(fieldData[i].Trim(), out value)) 
      addedRow.SetField<decimal?>(i, value); 
     else 
      addedRow.SetField<decimal?>(i, null); 
    } 
} 
+0

decimal.TryParse哇它是工作謝謝蒂姆:))) –

0

使用允許類型參數的DataColumn構造函數。

public DataColumn(
    string columnName, 
    Type dataType 
) 

http://msdn.microsoft.com/es-es/library/x1tyd60z(v=vs.110).aspx

所以,如果每列將是小數類型的

foreach (string column in colFields) 
    { 
     DataColumn datecolumn = new DataColumn(column, typeof(decimal)); 
     datecolumn.AllowDBNull = true; 
     csvData.Columns.Add(datecolumn); 
    } 
+0

當我用這一個ArgumentException了未處理csvData.Rows.Add(fieldData);輸入字符串的格式不正確 –

+0

當然,你需要轉換正如您聲明此列包含十進制值,將csv文件中的值添加到列之前的十進制值。使用decimal.Parse(fieldData)或Convert.ToDecimal(fieldData)。 csvData.Rows.Add(decimal.Parse(fieldData)) – Oscar

+0

我比較table1和表2(字符串類型),然後建立一個新表,我需要排序(table3)。我可以建立table3行爲十進制(有-ve值我需要它轉換爲十進制,因此它認爲-ve符號) –

0

您可以在創建的DataColumn時指定的數據類型。如果不指定數據(在你的例子一樣)明確地鍵入列將是字符串類型:

DataColumn datecolumn = new DataColumn(column, typeof(Decimal));