2017-06-07 4 views
0

Ich lese einige Spalten aus einer CSV-Datei und dann in einer DataGridView anzeigen. Die Spalte "Value" enthält einige 3-stellige Integer-Werte. Ich möchte, dass diese Integer-Werte in der Datagridview als doppelt mit einem Dezimalstellen angezeigt werden. Die Konvertierung scheint nicht zu funktionieren. Auch wenn ich eine große CSV-Datei (etwa 30k Zeilen) lade, wird sie sofort geladen, aber mit der Konvertierung dauert es zu viel Zeit.Konvertieren von datable Spalte in Doppel C#

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; 

Antwort

0

Klingt wie Sie zwei Fragen:

  1. Wie man den Wert auf eine einzige Dezimalstelle Maßstab zu formatieren.
  2. Warum dauert der Konvertierungsabschnitt so lange?

Hier sind Möglichkeiten

  1. this answer Sie, welche eine Möglichkeit der Verwendung gibt

String.Format("{0:0.##}", (Decimal) myTable.Rows[rowIndex].Columns[columnIndex]);

  1. Sie iterieren jede Zeile über der Datentabelle jedes Mal, wenn Sie eine Zeile lesen. Das heißt, wenn Sie Zeile 10 der CSV lesen, durchlaufen Sie die Zeilen 1-9 der DataTable erneut! Und so weiter für jede Zeile, die du liest! Umgestalten zu ziehen, dass die Schleife aus dem Readline ... etwas wie folgt aus:

    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;