新建控制台项目
安装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操作的资料请关注代码网其它相关文章!
发表评论