在运行时编辑动态记录

Edit dynamic records at runtime

我有一个 ASP.NET 应用程序编辑文件在运行时上传到服务器。

我必须处理 CSV 个文件,所以我选择了 FileHelpers 库。

因为我不知道 CSV 的 headers 是什么,我使用这个库在运行时动态创建一个自定义 class 并填充一个 DataTable 与 headers 和记录。

然后,应用程序将新列添加到 DataTable 并为每一行生成值。

我需要将新值写入 CSV 文件,因此我需要在不知道 class 格式的情况下在运行时编辑记录。

这是我到目前为止所做的片段,但如果你能给我一个如何执行此操作的提示,我将不胜感激:)

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);

我终于找到了解决这个问题的方法。

解决方案是使用 CsvEngine class 和他的 DataTableToCsv 方法。

对于好奇的人,这是最终代码:

列表值 = new List();

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);