一段刚刚出炉的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 ...
随机推荐
- elasticSearch6源码分析(6)http和transport模块
1.http模块概述 The http module allows to expose Elasticsearch APIs over HTTP. The http mechanism is comp ...
- es6学习笔记9--函数的扩展
函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接写在参 ...
- POJ 2771 Guardian of Decency(最大独立集数=顶点数-最大匹配数)
题目链接: http://poj.org/problem?id=2771 Description Frank N. Stein is a very conservative high-school t ...
- [转]解决ssh登录后闲置时间过长而断开连接
本文转自: 转载自博客园wanghetao的博客 我们通过终端连接服务器时,当鼠标和键盘长时间不操作,服务器就会自动断开连接,我们还的需要重新连接,感觉很麻烦,总结一下解决此问题的方法 方法一 修改/ ...
- Java基础——死锁
1.关于死锁,百度百科的解释: 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,他们将都无法进行下去.此时称系统处于死锁状态或系统产生了死锁 ...
- Java虚拟机 - 类加载机制
[深入Java虚拟机]之四:类加载机制 类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下 ...
- Oracle 临时表创建及删除
Oracle临时表 临时表分为两种 会话级别(ON COMMIT PRESERVE ROWS;) CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <co ...
- 微信小程序css画三角形内有文字
<view class="productStatus"> <span> <em>已上架</em> </span> < ...
- 【代码笔记】iOS-计算时间差
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...
- springboot项目中js、css静态文件路径访问
springboot静态文件访问的问题,相信大家也有遇到这个问题,如下图项目结构. 项目结构如上所示,静态页面引入js.css如下所示. 大家肯定都是这样写的,但是运行的话就是出不来效果,图片也不显示 ...