C#使用csvhelper實現(xiàn)csv的基本操作
新建控制臺項目
安裝csvhelper 33.0.1

寫入csv
新建Foo.cs
namespace CsvSut02;
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
批量寫入
using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;
namespace CsvSut02;
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>();
for (int i = 0; i < 100; i++)
{
foos.Add(new Foo()
{
Id = i,
Name = "我是" + i
});
}
var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
using (var writer = new StreamWriter(fileName))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
using (var csv = new CsvWriter(writer, config))
{
csv.WriteRecords(foos);
}
}
}
}

逐條寫入
using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;
namespace CsvSut02;
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>();
for (int i = 0; i < 100; i++)
{
foos.Add(new Foo()
{
Id = i,
Name = "我是" + i
});
}
var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
using (var writer = new StreamWriter(fileName))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
using (var csv = new CsvWriter(writer, config))
{
//這里看過來
foreach (var foo in foos)
{
csv.WriteRecord(foo);
csv.NextRecord();
}
}
}
}
}

增加標題
特性方式
using CsvHelper.Configuration.Attributes;
namespace CsvSut02;
public class Foo
{
[Name("Id")]
public int Id { get; set; }
[Name("Name")]
public string Name { get; set; }
}
using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;
namespace CsvSut02;
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>();
for (int i = 0; i < 100; i++)
{
foos.Add(new Foo()
{
Id = i,
Name = "我是" + i
});
}
var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
using (var writer = new StreamWriter(fileName))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
using (var csv = new CsvWriter(writer, config))
{
csv.WriteHeader<Foo>();
csv.NextRecord();
foreach (var foo in foos)
{
csv.WriteRecord(foo);
csv.NextRecord();
}
}
}
}
}

配置類
新建FooClassMap.cs
using CsvHelper.Configuration;
namespace CsvSut02;
public class FooClassMap : ClassMap<Foo>
{
public FooClassMap()
{
Map(m => m.Id)
.Index(0)
.Name("id");
Map(m => m.Name)
.Index(1)
.Name("name");
}
}
修改Program.cs
using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;
namespace CsvSut02;
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>();
for (int i = 0; i < 100; i++)
{
foos.Add(new Foo()
{
Id = i,
Name = "我是" + i
});
}
var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
using (var writer = new StreamWriter(fileName))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
using (var csv = new CsvWriter(writer, config))
{
csv.Context.RegisterClassMap<FooClassMap>();
csv.WriteHeader<Foo>();
csv.NextRecord();
foreach (var foo in foos)
{
csv.WriteRecord(foo);
csv.NextRecord();
}
}
}
}
}

可能有人覺得麻煩,使用配置類可以保證原始類的純粹,保證poco
讀取csv
讀取和寫入一樣,可以兩種方式實現(xiàn)一個是配置類一個是特性,下面都以特性演示
無標題csv

using CsvHelper.Configuration.Attributes;
namespace CsvSut02;
public class Foo
{
[Index(0)]
public int Id { get; set; }
[Index(1)]
public string Name { get; set; }
}
using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;
namespace CsvSut02;
class Program
{
static void Main(string[] args)
{
var file = "2024_07_24_18_24_00.csv";
using (var reader = new StreamReader(file))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
config.HasHeaderRecord = false;//沒有頭部
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords<Foo>().ToList();
foreach (var record in records)
{
Console.WriteLine(record.Id);
}
}
}
}
}

有標題csv

using CsvHelper.Configuration.Attributes;
namespace CsvSut02;
public class Foo
{
[Name("id")]
public int Id { get; set; }
[Name("name")]
public string Name { get; set; }
}
using CsvHelper.Configuration.Attributes;
namespace CsvSut02;
public class Foo
{
[Name("id")]
public int Id { get; set; }
[Name("name")]
public string Name { get; set; }
}
using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;
namespace CsvSut02;
class Program
{
static void Main(string[] args)
{
var file = "2024_07_24_18_30_49.csv";
using (var reader = new StreamReader(file))
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
config.HasHeaderRecord = true;//有頭部
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords<Foo>().ToList();
foreach (var record in records)
{
Console.WriteLine(record.Id);
}
}
}
}
}

增量寫入
using System.Globalization;
using System.Text;
using CsvHelper;
using CsvHelper.Configuration;
namespace CsvSut02;
class Program
{
static void Main(string[] args)
{
var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
WriteModelWithAppend(fileName);
WriteModelWithAppend(fileName);
}
/// <summary>
/// 追加方式寫入
/// </summary>
/// <param name="fileName"></param>
static void WriteModelWithAppend(string fileName)
{
var model = new Foo();
model.Id = 1;
model.Name = "測試";
// 檢查文件是否存在,以確定是否應該以追加模式打開
var mode = File.Exists(fileName) ? FileMode.Append : FileMode.Create;
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
using var writer = new StreamWriter(new FileStream(fileName, mode, FileAccess.Write, FileShare.Read),
Encoding.UTF8);
using var csv = new CsvWriter(writer, config);
if (mode == FileMode.Create)
{
csv.WriteHeader<Foo>();
csv.NextRecord();
}
csv.WriteRecord(model);
csv.NextRecord();
}
}

注意多線程有問題需要加鎖
以上就是C#使用csvhelper實現(xiàn)csv的基本操作的詳細內容,更多關于C# csvhelper實現(xiàn)csv操作的資料請關注腳本之家其它相關文章!
相關文章
C#自動創(chuàng)建數(shù)據(jù)庫實現(xiàn)代碼
C#下創(chuàng)建數(shù)據(jù)庫的代碼2008-03-03
C# OpenCvSharp實現(xiàn)去除字母后面的雜線
這篇文章主要為大家詳細介紹了C#如何使用OpenCvSharp實現(xiàn)去除字母后面的雜線效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-11-11
C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中
這篇文章介紹了C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04
C#程序連接數(shù)據(jù)庫及讀取數(shù)據(jù)庫中字段的簡單方法總結
包括C#連接Access、Oracle或者SQL Server,這里整理了一些C#連接數(shù)據(jù)庫及從讀取數(shù)據(jù)庫中字段的簡單方法總結,需要的朋友可以參考下2016-05-05

