首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作现有的CSV文件,同时保持列的顺序。(CsvReader/CsvWriter)

操作现有的CSV文件,同时保持列的顺序。(CsvReader/CsvWriter)
EN

Stack Overflow用户
提问于 2019-11-21 21:42:39
回答 1查看 869关注 0票数 2

我需要通过以下操作操作现有的CSV文件:

  1. 从现有的CSV文件->中读取,然后向其追加新行。我有下面的代码,它被第3行阻塞了--因为文件已经被第一行的代码使用了。另外,我不知道如何正确地读取它,然后在其上附加新行。

代码语言:javascript
复制
public bool Save(Customer customer)
{
    using (StreamReader input = File.OpenText("DataStoreOut.csv"))
    using (CsvReader csvReader = new CsvReader(input))
    using (StreamWriter output = File.CreateText("DataStoreOut.csv"))
    using (var csvWriter = new CsvWriter(output))
    {
        IEnumerable<Customer> records = csvReader.GetRecords<Customer>();

        List<Customer> customerList = new List<Customer>();
        customerList.Add(customer);

        csvWriter.WriteHeader<Customer>();
        csvWriter.NextRecord();

        foreach (var array in customerList)
        {
            csvWriter.WriteRecord(records.Append(array));
        }
    }
}

  1. 在CSV文件中的每一行都包含一个customer.CustomerId (这是唯一的,并且是只读的)。如何只读取具有特定customerId的行,然后在其中更新任何值.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-21 22:23:18

如果要将记录附加到文件中,最好的方法是读取项目,将新的项添加到集合中,并将所有内容写回。

代码语言:javascript
复制
public static void Append(Customer customer, string file)
{
    List<Customer> records = null;
    using (var reader = new StreamReader(file))
    {
        using (var csv = new CsvReader(reader))
        {
            records = csv.GetRecords<Customer>().ToList();
        }
    }
    records.Add(customer);

    using (var writer = new StreamWriter(file))
    {
        using (var csv = new CsvWriter(writer))
        {
            csv.WriteRecords(records);
        }
    }
}

正如@Dour High Arch所提到的,为了非常安全起见,您可能需要采取额外的步骤,使用临时文件,以防出问题。

如果您想要更新而不是追加,则必须查找指定的记录,如果它存在,则更新它。

代码语言:javascript
复制
public static void Update(Customer customer, string file)
{
    List<Customer> records = null;
    using (var reader = new StreamReader(file))
    {
        using (var csv = new CsvReader(reader))
        {
            records = csv.GetRecords<Customer>().ToList();
        }
    }
    var index = records.FindIndex(x => x.ID == customer.ID);
    if (index >= 0)
    {
        records[index] = customer;
        using (var writer = new StreamWriter(file))
        {
            using (var csv = new CsvWriter(writer))
            {
                csv.WriteRecords(records);
            }
        }
    }
}

同样,写入临时文件是明智的。

更新

实际上,如果您不想替换该文件,还有一种稍微好一些的附加方法。在实例化StreamWriter时,可以使用append=true来实现。在这种情况下,它将追加到文件的末尾。需要注意的一点是,如果EOF标记不是在新行,而是在最后一个记录的最后一个字段,这将将记录附加到最后一个字段的末尾,从而扰乱您的列。作为解决办法,我在使用writer.WriteLine();类的编写器之前添加了一个CSVHelper

代码语言:javascript
复制
public static void Append2(Customer customer, string file)
{
    using (var writer = new StreamWriter(file, true))
    {
        writer.WriteLine();
        using (var csv = new CsvWriter(writer))
        {
            csv.WriteRecord(customer);
        }
    }
}

如果该文件位于新行中,则将添加一个空行。这可以通过在读取文件时忽略空行来抵消。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58984212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档