C # Как удалить определенные строки из файла CSV и сохранить его как новый CSV с помощью CSVHelper?

#c# #csv #csvhelper

#c# #csv #csvhelper

Вопрос:

Я пытаюсь удалить определенные строки из своего CSV-файла, но, поскольку я новичок в C #, я не могу понять, как это сделать правильно.

У меня есть этот код, который загружает файл CSV и проходит через него.

 using (var reader = new StreamReader(@"DatamyCSV.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
        }
  

Но я не могу найти код, который удалил бы указанную строку.

Любая помощь приветствуется.

Комментарии:

1. Что заставляет вас думать, что вы можете удалить что-то из неизменяемого массива ? Вы понимаете, что означает слово «неизменяемый» в этом контексте? Зачем преобразовывать данные в неизменяемый массив, если вы собираетесь удалить запись из данных? Ваш вопрос неясен. Похоже, это даже не имеет никакого отношения к CSV, не говоря уже о библиотеке CSVHelper. Пожалуйста, улучшите его.

Ответ №1:

Вы могли бы извлечь все записи в память, а затем записать их обратно в файл.

 List<Books> records;

using (var reader = new StreamReader(@"DatamyCSV.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(@"DatamyCSV.csv"))
using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csvWriter.WriteRecords(records);
}
  

Для файла большего размера вам может потребоваться считывать по одной записи за раз в память и немедленно записывать ее обратно во временный файл. Затем удалите исходный файл и переименуйте временный файл.

 using (var reader = new StreamReader(@"DatamyCSV.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
using (var writer = new StreamWriter(@"DatamyCSV_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(@"DatamyCSV.csv");
File.Move(@"DatamyCSV_Temp.csv", @"DatamyCSV.csv");
  

Ответ №2:

Из https://github.com/JoshClose/CsvHelper/issues/1397:

CSVHelper предназначен только для пересылки, поэтому вам нужно прочитать существующий файл и записать новый.

Комментарии:

1. Я наткнулся на этот самый пост, но я не знаю, как написать новый файл или просмотреть существующий.

2. Тогда , возможно, вам следует перефразировать свой вопрос. Вы знакомы с CSVWriter? Я полагаю, это часть той же библиотеки.

Ответ №3:

Существует слишком много способов сделать это, не используя CSVHelper, поэтому я перечисляю несколько предложений, которые вы можете попробовать

  1. Самое простое решение, не вдаваясь в подробности, если файл достаточно мал (в МБ), считайте все строки в List или IEnumerable, а затем вы можете выполнить любую операцию с этой коллекцией и записать коллекцию обратно в файл.

  2. если вы новичок в c #, попробуйте выполнить все основные операции с файлами перед началом работы над реальным проектом. Следуйте инструкциям, таким как https://www.tutorialspoint.com/csharp/csharp_file_io.htm или видео на текстовых файлах YouTube: https://www.youtube.com/watch?v=cST5TT3OFyg Ввод — вывод файла : https://www.youtube.com/watch?v=9mUuJIKq40M

Используйте бесплатные инструменты, такие как LINQPad или dotnetfiddle, чтобы попробовать небольшие фрагменты кода перед написанием большой программы.

  1. как только вам будет удобно работать с файлами, используя .Чистые библиотеки, вы можете посмотреть на использование таких библиотек, как https://www.filehelpers.net / которые позволяют очень легко работать с файлами с множеством настраиваемых параметров. На их веб-сайте также есть много инструкций для работы с файлами.