C#如何使用CsvHelper从CSV文件中删除某些行并将其另存为新的CSV?

问题描述

我正在尝试从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
        }

但是我找不到删除指定行的代码

感谢您的帮助。

解决方法

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

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

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

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

,

有很多方法可以不专门使用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等免费工具来尝试小型代码段。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...