2016-05-12 4 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); 
Смежные вопросы