我需要通过以下操作操作现有的CSV文件:
public bool Save(Customer customer)
{
using (StreamReader input = File.OpenText("DataStoreOut.csv"))
using (CsvReader csvReader = new CsvReader(input))
using (StreamWriter output = File.CreateText("DataStoreOut.csv"))
using (var csvWriter = new CsvWriter(output))
{
IEnumerable<Customer> records = csvReader.GetRecords<Customer>();
List<Customer> customerList = new List<Customer>();
customerList.Add(customer);
csvWriter.WriteHeader<Customer>();
csvWriter.NextRecord();
foreach (var array in customerList)
{
csvWriter.WriteRecord(records.Append(array));
}
}
}发布于 2019-11-21 22:23:18
如果要将记录附加到文件中,最好的方法是读取项目,将新的项添加到集合中,并将所有内容写回。
public static void Append(Customer customer, string file)
{
List<Customer> records = null;
using (var reader = new StreamReader(file))
{
using (var csv = new CsvReader(reader))
{
records = csv.GetRecords<Customer>().ToList();
}
}
records.Add(customer);
using (var writer = new StreamWriter(file))
{
using (var csv = new CsvWriter(writer))
{
csv.WriteRecords(records);
}
}
}正如@Dour High Arch所提到的,为了非常安全起见,您可能需要采取额外的步骤,使用临时文件,以防出问题。
如果您想要更新而不是追加,则必须查找指定的记录,如果它存在,则更新它。
public static void Update(Customer customer, string file)
{
List<Customer> records = null;
using (var reader = new StreamReader(file))
{
using (var csv = new CsvReader(reader))
{
records = csv.GetRecords<Customer>().ToList();
}
}
var index = records.FindIndex(x => x.ID == customer.ID);
if (index >= 0)
{
records[index] = customer;
using (var writer = new StreamWriter(file))
{
using (var csv = new CsvWriter(writer))
{
csv.WriteRecords(records);
}
}
}
}同样,写入临时文件是明智的。
更新
实际上,如果您不想替换该文件,还有一种稍微好一些的附加方法。在实例化StreamWriter时,可以使用append=true来实现。在这种情况下,它将追加到文件的末尾。需要注意的一点是,如果EOF标记不是在新行,而是在最后一个记录的最后一个字段,这将将记录附加到最后一个字段的末尾,从而扰乱您的列。作为解决办法,我在使用writer.WriteLine();类的编写器之前添加了一个CSVHelper。
public static void Append2(Customer customer, string file)
{
using (var writer = new StreamWriter(file, true))
{
writer.WriteLine();
using (var csv = new CsvWriter(writer))
{
csv.WriteRecord(customer);
}
}
}如果该文件位于新行中,则将添加一个空行。这可以通过在读取文件时忽略空行来抵消。
https://stackoverflow.com/questions/58984212
复制相似问题