Csv 将datatable列转换为双C#

Csv 将datatable列转换为双C#,csv,datatable,double,Csv,Datatable,Double,我从csv文件中读取一些列,然后将其显示在DataGridView中。“值”列包含一些3位整数值。我想让这个整数值在datagridview中显示为带小数点的双精度值。转换似乎不起作用。此外,当我加载一个大的csv文件(大约30k行)时,它会立即加载,但转换需要花费太多时间 using (StreamReader str = new StreamReader(openFileDialog1.FileName)) { CsvReader csvReadFi

我从csv文件中读取一些列,然后将其显示在DataGridView中。“值”列包含一些3位整数值。我想让这个整数值在datagridview中显示为带小数点的双精度值。转换似乎不起作用。此外,当我加载一个大的csv文件(大约30k行)时,它会立即加载,但转换需要花费太多时间

 using (StreamReader str = new StreamReader(openFileDialog1.FileName)) {
                    CsvReader csvReadFile = new CsvReader(str);

                    dt = new DataTable();
                    dt.Columns.Add("Value", typeof(double));
                    dt.Columns.Add("Time Stamp", typeof(DateTime));

                    while (csvReadFile.Read()) {

                        var row = dt.NewRow();
                        foreach (DataColumn column in dt.Columns) {
                            row[column.ColumnName] = csvReadFile.GetField(column.DataType, column.ColumnName);
                        }
                        dt.Rows.Add(row);

                        foreach (DataRow row1 in dt.Rows)
                        {
                            row1["Value"] = (Convert.ToDouble(row1["Value"])/10);
                        }
                    }
                }
                dataGridView1.DataSource = dt;

听起来你有两个问题:

  • 如何将值设置为小数点后一位
  • 为什么代码的转换部分需要这么长时间
  • 这里有一些可能性

  • 请参阅指定使用的可能性
  • String.Format(“{0:0.###}”,(十进制)myTable.Rows[rowIndex]。Columns[columnIndex])

  • 每次读取一行时,您都要迭代数据表的每一行。这意味着当您读取CSV的第10行时,您将再次迭代数据表的第1-9行!你读到的每一行都是如此!重构以将该循环从读取行中拉出。。。大概是这样的:

    using (StreamReader str = new StreamReader(openFileDialog1.FileName)) {
                CsvReader csvReadFile = new CsvReader(str);
    
                dt = new DataTable();
                dt.Columns.Add("Value", typeof(double));
                dt.Columns.Add("Time Stamp", typeof(DateTime));
    
                while (csvReadFile.Read()) {
    
                    var row = dt.NewRow();
                    foreach (DataColumn column in dt.Columns) {
                        row[column.ColumnName] = csvReadFile.GetField(column.DataType, column.ColumnName);
                    }
                    dt.Rows.Add(row);
                }
                foreach (DataRow row1 in dt.Rows)
                {
                    row1["Value"] = (Convert.ToDouble(row1["Value"])/10);
                }
            }
            dataGridView1.DataSource = dt;