csvHelper 在最后一列旁边添加新列

csvHelper add new column beside last one

编辑,感谢您使用csvhelper的建议,这实际上帮助很大。

我所做的是创建一个新方法,如下所示:

    public static void AppendFile<T>(FileInfo fi, List<T> report)
    {
        var settings = new CsvConfiguration(new CultureInfo("en-GB"))
        {
            //Delimiter = ";"
        };


        using var stream = File.Open(fi.FullName, FileMode.Append);

        using var writer = new StreamWriter(stream);

        using (var csv = new CsvWriter(writer, settings))
        {
            csv.WriteRecords(report);
        }

    }

并完成 csvhelper 站点上的示例,创建一个新的 class:

    public class Foo
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

然后创建一个新列表:

    public class Foo
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

并这样称呼它:

AppendToFile.AppendFile(exportFile, records1);

这比我以前的效果更好,但是,不是在最后一列旁边添加新列,而是将它们添加到文件底部。

为了澄清,

我想做什么:

我得到了什么:

如您所见,它只是添加为新行而不是单独的列,我需要更改什么?

我想出了一个适合我的方法,可能不是最有效的,但它确实有效。

    public static void AppendFile(FileInfo fi, List<string> newColumns, DataTable newRows)
    {
        var settings = new CsvConfiguration(new CultureInfo("en-GB"))
        {
            Delimiter = ";"

        };


        var dt = new DataTable();
        using (var reader = new StreamReader(fi.FullName))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            using (var dataReader = new CsvDataReader(csv))
            {

                dt.Load(dataReader);

                foreach (var title in newColumns)
                {
                    dt.Columns.Add(title);
                }
                dt.Rows.Clear();

                foreach (DataRow row in newRows.Rows)
                {
                    dt.Rows.Add(row.ItemArray);
                }
            }

        }

        using var streamWriter = new StreamWriter(fi.FullName);
        using var csvWriter = new CsvWriter(streamWriter, settings);
        // Write columns
        foreach (DataColumn column in dt.Columns)

        {
            csvWriter.WriteField(column.ColumnName);
        }
        csvWriter.NextRecord();

        // Write row values
        foreach (DataRow row in dt.Rows)
        {
            for (var i = 0; i < dt.Columns.Count; i++)
            {
                csvWriter.WriteField(row[i]);
            }
            csvWriter.NextRecord();
        }


    }

我首先将 csv 文件的内容放入数据 table,然后添加我需要的新列。然后我清除 datatable 中的所有行并添加新行(删除的数据通过 newRows 参数重新添加)然后将 datatable 写入 csv 文件

实现目标的另一种方法是使用 csvWriter.WriteHeadercsvWriter.WriteRecord 将每个对象手动写入行。

void Main()
{
    var settings = new CsvConfiguration(new CultureInfo("en-GB"))
    {
        Delimiter = ";"

    };
    
    var fooList = new List<Foo>()
    {
        new Foo { Id = 67, Name = "test1,test2"}
    };
    
    List<MyClass> records;

    using (var reader = new StringReader("Author,Admin Owner\nChris Jones,\nJohn Thompson,\nBrian Oates,"))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        records = csv.GetRecords<MyClass>().ToList();
    }
    
    using var csvWriter = new CsvWriter(Console.Out, settings);
    
    csvWriter.WriteHeader<MyClass>();
    csvWriter.WriteHeader<Foo>();
    csvWriter.NextRecord();
    
    var i = 0;
    
    foreach (var record in records)
    {
        csvWriter.WriteRecord(record);
        
        if (i < fooList.Count())
        {
            csvWriter.WriteRecord(fooList[i]);
        }
        
        csvWriter.NextRecord();
        
        i++;
    }
    
}

public class MyClass
{
    public string Author { get; set; }
    [Name("Admin Owner")]
    public string AdminOwner { get; set; }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}