【问题标题】:C# How to delete certain rows from a CSV file and save it as a new CSV using CsvHelper?C# 如何从 CSV 文件中删除某些行并使用 CsvHelper 将其保存为新的 CSV?
【发布时间】:2020-09-23 20:51:19
【问题描述】:

我正在尝试从我的 CSV 文件中删除某些行,但由于我是 C# 新手,所以我不知道如何正确操作。

我有这段代码可以加载一个 CSV 文件并通过它。

using (var reader = new StreamReader(@"Data\myCSV.csv"))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            var records = csv.GetRecords<Books>();
            var books = records.ToImmutableArray();
            for (int i = 0; i < books.Length; ++i)
            {
                if (books[i].title == "someTitle")
                {
                    //Delete this row
                }
            }
        //Overwrite old csv
        }

但我找不到删除指示行的代码。

感谢任何帮助。

【问题讨论】:

  • 是什么让您认为您可以不可变数组中删除某些内容?你明白“不可变”这个词在这种情况下是什么意思吗?如果您打算从数据中删除记录,为什么要将数据转换为不可变数组?你的问题不清楚。它甚至似乎与 CSV 没有任何关系,更不用说 CsvHelper 库了。请改进它。

标签: c# csv csvhelper


【解决方案1】:

您可以将所有记录拉到内存中,然后将它们写回文件。

List<Books> records;

using (var reader = new StreamReader(@"Data\myCSV.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    records = csv.GetRecords<Books>().ToList();

    for (int i = 0; i < records.Count; ++i)
    {
        if (records[i].Title == "someTitle")
        {
            records.RemoveAt(i);
        }
    }
}

using (var writer = new StreamWriter(@"Data\myCSV.csv"))
using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csvWriter.WriteRecords(records);
}

对于较大的文件,您可能希望一次将一条记录读取到内存中,然后立即将其写回临时文件。然后删除原文件,重命名临时文件。

using (var reader = new StreamReader(@"Data\myCSV.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
using (var writer = new StreamWriter(@"Data\myCSV_Temp.csv"))
using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    Books record;

    csv.Read();
    csv.ReadHeader();

    csvWriter.WriteHeader(typeof(Books));

    while (csv.Read())
    {
        record = csv.GetRecord<Books>();

        if (record.Title != "someTitle")
        {
            csvWriter.NextRecord();
            csvWriter.WriteRecord(record);
        }                    
    }                
}

File.Delete(@"Data\myCSV.csv");
File.Move(@"Data\myCSV_Temp.csv", @"Data\myCSV.csv");

【讨论】:

    【解决方案2】:

    来自https://github.com/JoshClose/CsvHelper/issues/1397

    CsvHelper 只能转发,因此您需要通读现有文件并编写一个新文件。

    【讨论】:

    • 我遇到过那个帖子,但我不知道如何编写新文件或浏览现有文件。
    • 也许你应该把你的问题改写成that,那么。你熟悉 CSVWriter 吗?我相信它是同一个库的一部分。
    【解决方案3】:

    没有专门使用 CsvHelper 的方法太多,因此我列出了一些您可以尝试的建议

    1. 最简单的解决方案,无需详细说明,如果文件足够小(以 MB 为单位),将所有行读入 List 或 IEnumerable,然后您可以对该集合执行任何操作并将集合写回文件。

    2. 如果您是 C# 新手,请先尝试所有基本文件操作,然后再进行实际项目。遵循 https://www.tutorialspoint.com/csharp/csharp_file_io.htm 等教程或 youtube 上的视频 文本文件:https://www.youtube.com/watch?v=cST5TT3OFyg 文件 IO:https://www.youtube.com/watch?v=9mUuJIKq40M

    在编写大型程序之前,使用 LinqPad 或 dotnetfiddle 等免费工具尝试小代码 sn-ps。

    1. 一旦您习惯了使用 .Net 库处理文件,您就可以考虑使用诸如 https://www.filehelpers.net/ 之类的库,这使得处理具有许多可配置选项的文件变得非常容易。他们的网站上还有很多用于处理文件的教程。

    【讨论】:

      猜你喜欢
      • 2014-03-26
      • 2016-05-12
      • 2023-03-08
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2021-03-13
      相关资源
      最近更新 更多