新建控制台项目
安装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
读取和写入一样,可以两种方式实现一个是配置类一个是特性,下面都以特性演示
无标题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实现csv的基本操作的详细内容,更多关于c# csvhelper实现csv操作的资料请关注代码网其它相关文章!
发表评论