gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:58:47 26 4
gpt4 key购买 nike

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

  • 从现有的 CSV 文件中读取 -> 然后向其追加新行。
    我有以下代码阻塞了第 3 行 - 因为该文件已被第 1 行的代码使用。而且我不知道如何正确读取它,然后在其中添加新行。
  • 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));
    }
    }
    }
  • CSV 文件中的每一行都包含一个 customer.CustomerId(唯一且只读)。如何只读取具有特定 customerId 的行,然后更新那里的任何值。
  • 最佳答案

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

    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 所提到的,为了完全安全,尽管您可能想要采取额外的步骤使用临时文件以防出现问题。

    如果要更新而不是追加,则必须查找指定的记录,如果存在则更新它。
    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类(class)作家。
    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);
    }
    }
    }

    如果文件在新行中,那么这将添加一个空行。这可以通过在读取文件时忽略空行来解决。

    关于c# - 操作现有的 CSV 文件,同时保持列顺序。 (CsvReader/CsvWriter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984212/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com