2016-06-21 4 views
0

Ich habe eine Methode, die eine CSV-Zeile zurückgibt. Aber ich möchte dies in eine Datentabelle umwandeln. Das heißt, wo immer ein "," ist, möchte ich die Daten in eine neue Spaltenzelle einfügen.CSV in Datatable konvertieren

private static string ConvertGridViewRowToCsvRow(GridViewRow row) 
{ 
     StringBuilder csvRow = new StringBuilder(); 
     bool firstCell = true; 

     foreach (DataControlFieldCell cell in row.Cells) 
     { 
      string text = string.Empty; 

      if (!String.IsNullOrEmpty(cell.Text)) 
      { 
       text = cell.Text; 
      } 
      else if (cell.Controls.Count > 0) 
      { 
       foreach (var control in cell.Controls) 
       { 
        if (control is ITextControl) 
        { 
         var textControl = control as ITextControl; 
         text += HttpUtility.HtmlDecode(textControl.Text).Replace("\r", string.Empty).Replace("\n", string.Empty).Trim(); 
        } 
        else if (control is TextImage) 
        { 
         var textImage = control as TextImage; 
         text += HttpUtility.HtmlDecode(textImage.Text).Replace("\r", string.Empty).Replace("\n", string.Empty).Trim(); 
        } 
       } 
      } 

      if (!firstCell) 
      { 
       csvRow.Append(","); 
      } 

      csvRow.Append(MakeTextCsvFriendly(text)); 
      firstCell = false; 
     } 

     return csvRow.ToString(); 
} 

Dies ist die Methode, die während einer Schaltfläche klicken, die ruft ConvertGridViewRowToCsvRow

public static void Export(string fileName, GridView gv, HashSet<string> selectedRows) 
{ 
     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.AddHeader(
      "content-disposition", string.Format("attachment; filename={0}", fileName)); 
     HttpContext.Current.Response.ContentType = "text/csv"; 

     //SetHiddenColumnsVisibility(gv); enable if you want only selected columns to visible on export (not current business requirement) 

     var csvFile = new StringBuilder(); 

     using (StringWriter sw = new StringWriter()) 
     { 
      using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
      { 
       if (gv.HeaderRow != null) 
       { 
        GridViewExportUtil.PrepareControlForExport(gv.HeaderRow); 
        bool firstCell = true; 

        foreach (DataControlFieldHeaderCell cell in gv.HeaderRow.Cells) 
        { 
         if (!firstCell) 
         { 
          csvFile.Append(","); 
         } 

         string text = cell.ContainingField.HeaderText; 
         csvFile.Append(MakeTextCsvFriendly(text)); 
         firstCell = false; 
        } 

        csvFile.Append("\r\n"); 
       } 

       if (selectedRows.Count > 0) 
       { 
        foreach (GridViewRow row in gv.Rows) 
        { 
         if (row.RowType == DataControlRowType.DataRow && selectedRows.Contains(gv.DataKeys[row.RowIndex].Value.ToString())) 
         { 
          GridViewExportUtil.PrepareControlForExport(row); 
          csvFile.AppendLine(ConvertGridViewRowToCsvRow(row)); 
         } 
        } 
       } 
       else 
       { 
        foreach (GridViewRow row in gv.Rows) 
        { 
         GridViewExportUtil.PrepareControlForExport(row); 
         csvFile.AppendLine(ConvertGridViewRowToCsvRow(row)); 
        } 
       } 

       // render the htmlwriter into the response 
       HttpContext.Current.Response.Write(csvFile.ToString()); 
       HttpContext.Current.Response.End(); 
      } 
     } 
    } 

Ich dachte an eine Methode, die csvFile.Append(","); oder möglicherweise ersetzen würde, die verwenden würde eine solche Datei zu speichern, die aufgerufen wird, Daten in einer DataTable.

Allerdings brauche ich Anleitung bei der Strukturierung dieser Methode.

+0

[FileHelpers] (http://www.filehelpers.net/) ist alles, was Sie brauchen –

Antwort

-1

Ich versuche unten Code, um CSV-Datei zu Datentabelle für Windows-Anwendung zu konvertieren.

private void CSVtoDataTable(string filepath) 
{ 
    int count = 1;    
    char fieldSeparator = ','; 
    DataTable csvData = new DataTable(); 

    using (TextFieldParser csvReader = new TextFieldParser(filePath)) 
    {     
     csvReader.HasFieldsEnclosedInQuotes = true;     
     while (!csvReader.EndOfData) 
     { 
      csvReader.SetDelimiters(new string[] { "," }); 
      string[] fieldData = csvReader.ReadFields(); 
      if(count==0) 
      { 
       foreach (string column in fieldData) 
       { 
        DataColumn datecolumn = new DataColumn(column); 
        datecolumn.AllowDBNull = true; 
        csvData.Columns.Add(datecolumn); 
       } 
      } 
      else 
      { 
       csvData.Rows.Add(fieldData); 
      }     

     } 
    } 

} 
+0

Wenn es gut funktionieren ist, vergessen Sie nicht, es als Antwort zu markieren. –

+0

Ihr Code hat nicht für mich kompiliert oder funktioniert. Nach dem Einschließen "mit Microsoft.VisualBasic.FileIO;" Wenn ich "filePath" in "filepath" ändere, habe ich noch eine System.ArgumentException: Input-Array ist länger als die Anzahl der Spalten in dieser Tabelle. – Miryafa