一段刚刚出炉的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 ...
随机推荐
- offsetHeight,scrollHeight,clientHeight,scrollTop以及pageX,clientX,offsetX,screenX,offsetLeft,style.left等的区别以及使用详解
一.写在前面 在阅读本文前,希望大家能针对每个属性亲手测试,网上现有的大量相关博客都有不等的概念错误,毕竟亲手实践才能更好的掌握这些概念. 1.pageX,clientX,screenX与offset ...
- KMP算法(——模板习题与总结)
KMP算法是一种改进的模式匹配算法,相比于朴素的模式匹配算法效率更高.下面讲解KMP算法的基本思想与实现. 先来看一下朴素模式匹配算法的基本思想与实现. 朴素模式匹配算法的基本思想是匹配过程中如果该位 ...
- JS去掉字符串前后空格或去掉所有空格的用法
1. 去掉字符串前后所有空格: 代码如下: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } 说明 ...
- [Redis]Redis的数据类型
存储String字符串,使用get,set命令,一个键最大存储512M 存储Hash哈希,使用HMSET和HGETALL命令,参数:键,值 例如:HMSET user:1 username taosh ...
- JFace TableViewer性能改善 -- 使用VirtualTable
前一篇提到了SWT中的table的通过使用virtual table性能得到很大的改善,那么如果既存的工程中使用的是TableViewer来创建的表,也能改成virtual table吗? 答案是肯定 ...
- Mybatis中的缓存
Mybatis提供缓存查询功能,用于减轻数据库压力,提升数据查询能力. Mybatis中定义了两级缓存:包括一级缓存与二级缓存.示意图如下所示: 一.一级缓存 一级缓存的特点: 每一个SqlSessi ...
- OpenStack的架构详解[精51cto]
OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云.小云提供可扩展的.灵活的 ...
- HDU6195
cable cable cable Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- POJ2398(KB13-B 计算几何)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5968 Accepted: 3573 Descr ...
- 截取URL的某个参数值
原文作者链接 https://www.jianshu.com/p/c9324d237a8e