c#实现数据集合转换为csv文本
需求
1、将一个数据集合导出到一个csv文件中,集合类型可以视为 List<T>,T为任意类型,T包含多个属性,可指定部分属性进行导出
2、软件中有多种不同类型的数据类型需要进行导出
需求很简单,简单分析下
1、csv格式就是文本格式,包含多行数据,每行包含多列文字,文字间已Tab标记分隔(简单,无需过多考虑)
2、针对数据类型T可以是任意类型,
3、支持指定属性导出,同一个类型也允许指定不同的属性组分别导出
4、属性与最终生成的文件中的列 一一对应,每个属性可以设置对应的列名称
初步构想解决方案
1、指定需要导出的属性名称,通过反射获取对象的属性值
2、拼接为csv文本字符串
3、提供属性名称与列名称的一一对应关系
4、使用一个简单的导出csv工具类型,仅一个一个静态方法,接受List<T>类型数据集合,以List<Piar>方式传入ColumnName与PropertyName的键值对
5、写入某指定的csv文件
实际编码
开发过程适当合理更改,如将文件写入逻辑移除(文件写入逻辑应在上层进行),保持导出逻辑简单,形成如下代码
调用方法
假设类型定义如下
public class User
{
public string Name { get;set; }
public string Info { get;set; }
}
若存在一个用户列表List<User> Users{get;set;}
则生成csv格式字符串的代码如下
public string GenerateUserExportText()
{
return ExportCsvUtility.GenerateExportText(Usrs, new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("用户名", "Name"),
new KeyValuePair<string, string>("用户信息", "Info"),
});
}
上层使用的选择保存文件 及 写入文件的方法可以参照我提供的下列代码:
注意StreamWriter的构造方法中,需传入参数设置Unicode编码,否则Excel打开csv文件会有问题
private bool TryGetOutFilePath(out string filePath)
{
SaveFileDialog saveFileDialog = new SaveFileDialog()
{
FileName = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"),
DefaultExt = ".text",
Filter = "csv documents (.csv)|*.csv",
}; if (saveFileDialog.ShowDialog() == true)
{
filePath = saveFileDialog.FileName;
return true;
} filePath = string.Empty;
return false;
} private void ExportToFile(string filePath, string fullText)
{
try
{
using (FileStream outFileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
using (TextWriter textWriter = new StreamWriter(outFileStream, Encoding.Unicode))
{
textWriter.Write(fullText);
}
}
}
catch (Exception e)
{
ExceptionHandler.HandleException(e);
}
}
后续Ant会带来更多c#相关技术文章
代码中使用的反射技巧,直接从我的其他项目中抽取了过来,后续可以专门做个介绍
c#实现数据集合转换为csv文本的更多相关文章
- java 读取CSV数据并写入txt文本
java 读取CSV数据并写入txt文本 package com.vfsd; import java.io.BufferedWriter; import java.io.File; import ja ...
- linq之将IEnumerable<T>类型的集合转换为DataTable类型 (转载)
在考虑将表格数据导出成excel的时候,网上搜的时候找到一个特别合适的公共方法,可以将query查询出来的集合转换为datatable 需引用using System.Reflection; publ ...
- linq根据传入数据集合查询对应子级数据
工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 ...
- Oracle数据表转换为Shapefile(一)
严格来说,文章标题中的“转换”并不完全合适.本文的主要内容是基于Oracle数据表的数据来生产出Shapefile文件.进行该工作的一个前提条件是:Oracle数据表中包含坐标数值字段,一般来说就是x ...
- linq依据传入数据集合查询相应子级数据
工作中经经常使用到的linq依据传入数据集合查询相应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点相应ID数据集合,再依据ID数据集合查询所有子级数据. //获取缓存 ...
- python脚本-excel批量转换为csv文件
pandas和SQL数据分析实战视频教程 https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2& ...
- 如何将EDI报文转换为CSV格式文件?
如果您对EDI项目实施有一定的了解,想必您一定知道,在正式开始EDI项目实施之前,都会有EDI顾问与您接洽,沟通EDI项目需求.其中,会包含EDI通信双方使用哪种传输协议,传输的报文是符合什么标准的, ...
- C# .csv文件转为Excel格式;Excel格式转换为.csv
using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windo ...
- Immutable.js – JavaScript 不可变数据集合
不可变数据是指一旦创建就不能被修改的数据,使得应用开发更简单,允许使用函数式编程技术,比如惰性评估.Immutable JS 提供一个惰性 Sequence,允许高效的队列方法链,类似 map 和 f ...
随机推荐
- xmf 翻译
避免在详细信息视图的确认对话框显示? https://documentation.devexpress.com/#Xaf/CustomDocument3160 我如何获得从登录窗口应用程序的数据库? ...
- HTML5 修改浏览器url而不刷新页面
嘛,起因是黑子大叔在微博上的一条@信息,找起了这个的实现,看了一圈google的中文信息内似乎还没有怎么提到这个的内容,就发表上来. 详细效果就是类似于用Firefox4+/Chrome 5+/Saf ...
- 如何在 iOS 8 中使用 Swift 实现本地通知(下)
在上集中,我们已经构建了一个简单的待办列表应用(to-do list app),这个应用可以在待办项过期时通过本地通知提醒用户.现在,我们要在之前的基础上添加以下功能:应用图标角标上显示过期待办项的数 ...
- mysqldump 安全 --skip-add-drop-table
[root@localhost data]# mysqldump -uroot --master-data=2 -p --single-transaction --skip-add-drop-ta ...
- 解决CSDN的code功能,无法git clone多个项目的问题
几天前在使用CSDN的git功能的时候发现一个问题:我在CSDN上创建了两个项目,但是却只能git clone其中的一个. 原因: 在添加ssh公钥的时候,将主机上的ssh公钥在CSDN上填的地方不合 ...
- eclipse中的tomcat debug模式启动报超时45s
在eclipse中加入tomcat,开debug模式非常好用,这里就不介绍了 最近eclipse的tomcat开debug模式就是启动不了,增加时间也不能解决,但是非debug模式就可以打开,我觉得是 ...
- [Java] 内部类总结
内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权 ...
- Redis操作的封装类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ServiceS ...
- 【Android Studio使用教程5】使用SDK Manager时, SDK下载更新不了的解决方案(eclipse 也适用)
在线更新sdk时会很慢,甚至下载不了, 此时在SDK Manager中,选择Tools,Proxy里面填上 mirrors.neusoft.edu.cn 和 80 把下面的force https xx ...
- 【Android 界面效果15】Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)
Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. 一个相对完善的自定义控件在布局文件中和java ...