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

寫(xiě)入csv
新建Foo.cs
namespace CsvSut02;
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
批量寫(xiě)入
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);
}
}
}
}

逐條寫(xiě)入
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))
{
//這里看過(guò)來(lái)
foreach (var foo in foos)
{
csv.WriteRecord(foo);
csv.NextRecord();
}
}
}
}
}

增加標(biāo)題
特性方式
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();
}
}
}
}
}

可能有人覺(jué)得麻煩,使用配置類可以保證原始類的純粹,保證poco
讀取csv
讀取和寫(xiě)入一樣,可以兩種方式實(shí)現(xiàn)一個(gè)是配置類一個(gè)是特性,下面都以特性演示
無(wú)標(biāo)題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;//沒(méi)有頭部
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords<Foo>().ToList();
foreach (var record in records)
{
Console.WriteLine(record.Id);
}
}
}
}
}

有標(biāo)題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);
}
}
}
}
}

增量寫(xiě)入
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>
/// 追加方式寫(xiě)入
/// </summary>
/// <param name="fileName"></param>
static void WriteModelWithAppend(string fileName)
{
var model = new Foo();
model.Id = 1;
model.Name = "測(cè)試";
// 檢查文件是否存在,以確定是否應(yīng)該以追加模式打開(kāi)
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();
}
}

注意多線程有問(wèn)題需要加鎖
以上就是C#使用csvhelper實(shí)現(xiàn)csv的基本操作的詳細(xì)內(nèi)容,更多關(guān)于C# csvhelper實(shí)現(xiàn)csv操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)實(shí)現(xiàn)代碼
C#下創(chuàng)建數(shù)據(jù)庫(kù)的代碼2008-03-03
C#實(shí)現(xiàn)的UDP收發(fā)請(qǐng)求工具類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的UDP收發(fā)請(qǐng)求工具類,結(jié)合具體實(shí)例形式分析了C#針對(duì)UDP請(qǐng)求的監(jiān)聽(tīng)、接收、發(fā)送等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
C# OpenCvSharp實(shí)現(xiàn)去除字母后面的雜線
這篇文章主要為大家詳細(xì)介紹了C#如何使用OpenCvSharp實(shí)現(xiàn)去除字母后面的雜線效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中
這篇文章介紹了C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C#程序連接數(shù)據(jù)庫(kù)及讀取數(shù)據(jù)庫(kù)中字段的簡(jiǎn)單方法總結(jié)
包括C#連接Access、Oracle或者SQL Server,這里整理了一些C#連接數(shù)據(jù)庫(kù)及從讀取數(shù)據(jù)庫(kù)中字段的簡(jiǎn)單方法總結(jié),需要的朋友可以參考下2016-05-05
C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二
上文對(duì)數(shù)據(jù)結(jié)構(gòu)與算法,有了一個(gè)簡(jiǎn)單的概述與介紹,這篇文章,我們介紹一中典型數(shù)據(jù)結(jié)構(gòu)——線性結(jié)構(gòu)2012-10-10

