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 ...
随机推荐
- Socket编程学习之道:揭开Socket编程的面纱
对TCP/IP.UDP.Socket编程这些词你不会非常陌生吧?随着网络技术的发展.这些词充斥着我们的耳朵. 那么我想问: 1. 什么是TCP/IP.UDP? 2. S ...
- [Angular2 Router] Lazy Load Angular 2 Modules with the Router
Angular 2 lazy loading is a core feature of Angular 2. Lazy loading allows your application to start ...
- 汉化Eclipse+配色方法(官方语言包)
一. 汉化方法: 1.Eclipse版本查询:安装目录readme,查版本号;参照查代号如下表: 代号 平台版本 项目 主要版本发行日期 SR1发行日期 SR2发行日期 N/A 3.0 [1] N/A ...
- C++-copy constructor、copy-assignment operator、destructor
本文由@呆代待殆原创,转载请注明出处. 对于一个类来说,我们把copy constructor.copy-assignment operator.move constructor.move-assig ...
- 自定义uiview 当没有数据的时候 显示自定义的uiview界面
// // ZSDTJNoDataView.h // ZSDTJNoDataView // // Created by Mac on 14-12-28. // Copyright (c) 2014年 ...
- 一个Java线程死锁的例子
package com.lk.B; public class Test4 { private static final Object o1 = new Object(); private static ...
- nginx设置SSL反向代理
Nginx的反向代理通常用来映射内网中提供的Apache.IIS.Lighttpd服务,以实现负载均衡:同时,由于动态服务程序运行在内网,服务器的整体安全性也有所提高,那么怎样用nginx设置SSL的 ...
- 如何将你自己的Python package发布到PyPI上
零.前言 最近做了一个小工具,查询IP或者域名的归属地.做完之后想发布到PyPI上,这样大家就可以通过pip来安装了. 在发布的过程中遇到了一些问题,也学到了很多东西.记录到这篇文章中.希望对大家有所 ...
- 单例模式——Singleton
模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中 ...
- PHP删除符合条件的整个目录
<?php /** * @name delFile函数与delDir函数一起使用, 删除符合条件的整个目录 * @param string $path 指定操作路径 * @return null ...