问题描述
我正在尝试从CSV文件中删除某些行,但是由于我是C#的新手,所以我不知道该怎么做。
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来完成,因此我列出了一些可以尝试的建议
-
最简单的解决方案,无需赘述,如果文件足够小(以MB为单位),则将所有行读取到List或IEnumerable中,然后您可以对该集合进行任何操作并将集合写回到文件中
-
如果您不熟悉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等免费工具来尝试小型代码段。
- 一旦您习惯使用.Net库处理文件,就可以考虑使用诸如https://www.filehelpers.net/之类的库,这使使用带有许多可配置选项的文件非常容易。他们的网站上也有很多文件可以使用。