2016-05-12 49 views
0

我有一個ASP.NET應用程序在運行時編輯上載到服務器上的文件。在運行時編輯動態記錄

我必須處理CSV文件,所以我選擇了FileHelpers庫。

因爲我不知道CSV的標題是什麼,所以我使用這個庫在運行時動態創建一個自定義類,並使用標題和記錄填充DataTable

然後,應用程序向DataTable添加一個新列,併爲每行生成值。

我需要將新值寫入CSV文件,因此我需要在運行時編輯記錄而不必知道類格式。

下面是我迄今所做的片斷,但如果你可以給我如何執行此一提示,我會很感激:)

List<object> values = new List<object>(); 

var classBuilder = new DelimitedClassBuilder("CSVClass", delimiter.ToString(), dataTable); 

classBuilder.LastField.FieldOptional = true; 

Engine = new FileHelperEngine(classBuilder.CreateRecordClass()); 

string lastFieldName = classBuilder.LastField.FieldName; 
i = 0; 
foreach (dynamic record in Engine.ReadFile(filePath)) 
{ 
    record.Test = newValues[i]; //This line is working as the new column is named "Test" but if the column name changes, it throws an exception of course 

    values.Add(record); 

    i++; 
} 

Engine.WriteFile(filePath, values); 

回答

0

我終於找到了我的方式,通過這種。

解決方法是使用CsvEngine類和他的DataTableToCsv方法。

對於好奇的,這裏是最終的代碼:

列表值=新列表();

string header = null; 

DataRow row = dataTable.NewRow(); 

int i = 0; 
foreach (var value in newValues) 
{ 
    string newValue = value; 

    if (i == 0) 
    { 

     List<object> headers = valuesDictionnary[0].ToList<Object>(); 
     int count = 1; 
     while (true) 

      if (headers.Contains(newValue)) 
      { 
       newValue = value + "_" + count; 
       count++; 
      } 
      else 
       break; 

     header = newValue; 
     dataTable.Columns.Add(newValue); 

     foreach(DataColumn column in dataTable.Columns) 
     { 
      row[column.ColumnName] = column.ColumnName; 
     } 

     dataTable.Rows.InsertAt(row, 0); 
    } 

    dataTable.Rows[i][header] = newValue; 
    i++; 
} 

CsvEngine.DataTableToCsv(dataTable, filePath, new CsvOptions("CSVOptions", delimiter, filePath)); 

dataTable.Rows.RemoveAt(0);