#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, поэтому я перечисляю несколько предложений, которые вы можете попробовать
-
Самое простое решение, не вдаваясь в подробности, если файл достаточно мал (в МБ), считайте все строки в List или IEnumerable, а затем вы можете выполнить любую операцию с этой коллекцией и записать коллекцию обратно в файл.
-
если вы новичок в 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, чтобы попробовать небольшие фрагменты кода перед написанием большой программы.
- как только вам будет удобно работать с файлами, используя .Чистые библиотеки, вы можете посмотреть на использование таких библиотек, как https://www.filehelpers.net / которые позволяют очень легко работать с файлами с множеством настраиваемых параметров. На их веб-сайте также есть много инструкций для работы с файлами.