将 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;
}
}
我正在从网上读取一个 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;
}
}