一段刚刚出炉的CSV文件转换为DataTable对象的代码
CSV是以文本形式保存的表格数据,具体是每列数据使用逗号分割,每行数据使用CRLF(\r\n)来结尾,如果数据值包含逗号或CRLF则使用双引号将数值包裹,如果数据值包含双引号则使用两个双引号做为转义。
public static class Common
{
public static DataTable CSVToDataTable(string path)
{
//第一行是否为列名
bool firstColumnIsName = false; //文件读取的位置信息
int current = ; //当前是否为一个值的开始处
bool isNewValueBegin = true; //当前是否为双引号范围
bool isDoubleMarkMange = false; //存储数据
List<List<string>> datatable = new List<List<string>>(); #region 解析文件
using (FileStream fs = new FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
{
using (System.IO.StreamReader sr = new StreamReader(fs, Encoding.Default))
{
List<string> row = new List<string>(); string csv = sr.ReadToEnd(); string temp = ""; while (current < csv.Length)
{
char buffer = csv[current];
bool bufferNextExist = current + < csv.Length;
char bufferNext = '\0';
if (bufferNextExist)
{
bufferNext = csv[current + ];
} if (isNewValueBegin && buffer == '"')
{
isDoubleMarkMange = true;
}
else if (buffer == ',' && isDoubleMarkMange == false)
{
row.Add(temp);
temp = "";
isNewValueBegin = true;
}
else if (isDoubleMarkMange && buffer == '"' && bufferNextExist && bufferNext == '"')
{
//如果在双引号范围内并且连续出现两个双引号则表示值中包含一个双引号
temp += buffer;
current++;
}
else if (isDoubleMarkMange && buffer == '"' && (bufferNextExist == false || (bufferNextExist && bufferNext != '"')))
{
//如果在双引号范围内并出现一个双引号则表示结束双引号范围
isDoubleMarkMange = false;
}
else if (buffer == '\r' && bufferNextExist && bufferNext == '\n')
{
//表示一个换行符,但是如果在双引号内则表示正常的文字换行
if (isDoubleMarkMange)
{
temp += "\r\n";
}
else
{
row.Add(temp);
datatable.Add(row);
temp = "";
row = new List<string>();
isNewValueBegin = true;
}
current++;
}
else if (buffer == '\r' && isDoubleMarkMange == false)
{
row.Add(temp);
datatable.Add(row);
temp = "";
row = new List<string>();
isNewValueBegin = true;
}
else
{
//正常字符
temp += buffer;
} current++;
}
}
}
#endregion #region 转换为DataTable
DataTable dt = new DataTable(); if (datatable.Count > )
{
int columns = datatable[].Count;
for (int i = ; i < datatable.Count; i++)
{
columns = Math.Max(columns, datatable[i].Count);
} for (int i = ; i < columns; i++)
{
DataColumn dc = new DataColumn("column" + i);
if (firstColumnIsName)
if (datatable[].Count > i)
dc.ColumnName = datatable[][i];
dt.Columns.Add(dc);
} for (int i = firstColumnIsName ? : ; i < datatable.Count; i++)
{
DataRow dr = dt.NewRow(); for (int j = ; j < datatable[i].Count; j++)
{
dr[j] = datatable[i][j];
}
dt.Rows.Add(dr);
}
}
#endregion return dt;
}
一段刚刚出炉的CSV文件转换为DataTable对象的代码的更多相关文章
- csv文件与DataTable互相导入处理
封装处理下,以后项目用到可以直接使用,比较简单. 1.首先看封装好的类 using System; using System.Data; using System.IO; using System.T ...
- mongodb-导出数据到csv文件或json文件
在mongodb的bin目录下, 有一个mongoexport, 可用于数据的导出 [wenbronk@localhost bin]$ ./mongoexport --help Usage: mong ...
- c# 将csv文件转换datatable的两种方式。
第一种: public static DataTable csvdatatable(string path) { DataTable dt = new DataTable(); string conn ...
- javascript导出csv文件(excel)
这里贴出JavaScript导出csv文件(excel)的代码. /** * 导出excel * @param {Object} title 标题列key-val * @param {Object} ...
- python爬取当当网的书籍信息并保存到csv文件
python爬取当当网的书籍信息并保存到csv文件 依赖的库: requests #用来获取页面内容 BeautifulSoup #opython3不能安装BeautifulSoup,但可以安装Bea ...
- java将数据生成csv文件
1,httpRequest接口触发进程[或者可以换成其他方式触发] /** * 出入库生成CSV文件 * @param req * @param params * @return */@Request ...
- C语言读取写入CSV文件 [一]基础篇
本系列文章目录 [一] 基础篇 [二] 进阶篇--写入CSV [三] 进阶篇--读取CSV 什么是CSV? CSV 是一种以纯文本形式存储的表格数据,具体介绍如下(来自维基百科): 逗号分隔值(Com ...
- C# .csv文件转为Excel格式;Excel格式转换为.csv
using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windo ...
- SQL Server:把CSV文件导入到SQL Server表中
有时候我们可能会把CSV中的数据导入到某个数据库的表中,比如做报表分析的时候. 对于这个问题,我想一点也难不倒程序人员吧!但是要是SQL Server能够完成这个任务,岂不是更好! 对,SQL Ser ...
随机推荐
- Spring AOP切面变成——创建增强类
说明 Spring使用增强类定义横向逻辑,同时Spring只支持方法连接点,增量类还包含在方法的哪一点添加横切代码的方位信息.所以增强既包含横向逻辑,又包含部分连接点的信息. 类型 按着增强在目标类方 ...
- Java设计模式学习记录-建造者模式
前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...
- 【转载】Java8 HashMap之tableSizeFor
Java8对许多内置的容器进行了优化与拓展,其中对HashMap的改变尤其大.之后将进行总结. 最近在看HashMap的源码时,发现了里面好多很不错的算法,相比Java7从性能上提高了许多.其中tab ...
- ionic 混合应用开发
windows下安装配置 npm install -g ionic npm install -g cordova ionic start myproject cd myproject ionic pl ...
- 【Java并发编程】12、ThreadLocal 解决SimpleDateFormat非线程安全
大致意思:Tim Cull碰到一个SimpleDateFormat带来的严重的性能问题,该问题主要有SimpleDateFormat引发,创建一个 SimpleDateFormat实例的开销比较昂贵, ...
- java中那些类是线程安全的?
Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...
- Open Credit System(UVA11078)
11078 - Open Credit System Time limit: 3.000 seconds Problem E Open Credit System Input: Standard In ...
- 【 js 基础 】【读书笔记】关于this
this 关键字是 Javascript 中很特别的一个关键字,被自动定义在所有函数的作用域中.this提供了一种更优雅的方式隐式“传递”一个对象的引用.今天就来说说 this 的指向问题. this ...
- HTML初学小技巧
01.让背景图不滚动IE浏览器支持一个 Body 属性 bgproperties,它可以让背景不滚动:〈Body Background="图片文件" bgproperties=&q ...
- 【代码笔记】iOS-plist获得城市列表
一,工程图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the ...