将 DataRow 中的字符串转换为 double

Convert strings in DataRow to double

我正在从网上读取一个 csv 文件并将其转换为数据表。第一列是一个字符串。第 2、3 和 4 列是数字。我想将第 2、3 和 4 列转换为双列。我已经编写了下面的方法来执行此任务。但是,当我进行转换 "Convert.ToDouble" 并将其存储回数据行时,它似乎将其保留为字符串对象。

public static DataTable ConvertCSVtoDataTable(string strFilePath)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strFilePath);
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

    StreamReader sr = new StreamReader(resp.GetResponseStream());
    string[] headers = sr.ReadLine().Split(',');
    DataTable dt = new DataTable();
    foreach (string header in headers)
    {
        dt.Columns.Add(header);
    }
    while (!sr.EndOfStream)
    {
        string[] rows = sr.ReadLine().Split(',');
        DataRow dr = dt.NewRow();
        for (int i = 0; i < headers.Length; i++)
        {                
            switch (i)
            {
                //Convert columns 1,2, and 3 to double
                case 1:
                    dr[i] = Convert.ToDouble(rows[i]); 

                    break;
                case 2:
                    dr[i] = Convert.ToDouble(rows[i]);
                    break;
                case 3:
                    dr[i] = Convert.ToDouble(rows[i]);
                    break;
                default:
                    dr[i] = rows[i];
                    break;
            }                              
        }
        dt.Rows.Add(dr);
    }

    return dt;
}

添加列时需要指定列类型。将创建列的代码更改为类似这样的内容(基于您希望输入的列 double):

foreach (string header in headers.Take(3))
{
    dt.Columns.Add(header, typeof(double));
}

foreach (string header in headers.Skip(3))
{
    dt.Columns.Add(header, typeof(string));
}

此代码将创建类型为 double 的前三列和类型为 string 的其余列。

引自此MSDN reference

By default, the DataType for the new column is string

如果您不指定类型,那么您会得到一个默认类型为 string 的列。

foreach循环替换为

for (int i = 0; i < headers.Length; i++)
{
    if (i >= 1 && i <= 3)
        dt.Columns.Add(headers[i], typeof(double));
    else
        dt.Columns.Add(headers[i]);
}

而不是:

foreach (string header in headers)
{
    dt.Columns.Add(header);
}

使用

for (int i = 0; i < headers.Count(); i++ )
{
    switch (i)
    {
        case 1: case 2: case 3:
            dt.Columns.Add(headers[i], typeof(double));
            break;
        default:
            dt.Columns.Add(headers[i], typeof(string));
            break;
    }
}