在运行时编辑动态记录

时间:2016-05-12 10:50:48

标签: c# asp.net csv dynamic filehelpers

我在运行时在服务器上上传了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);

1 个答案:

答案 0 :(得分: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);