一段刚刚出炉的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 ...
随机推荐
- 我的菜单在母版页,如何更改菜单点击后的效果 Ver2
很久之前,Insus.NET使用ASP.NET实现一个功能,非javascript.<我的菜单在母版页,如何更改菜单点击后的效果>http://www.cnblogs.com/insus/ ...
- Spring基础(8) : 延迟加载,Bean的作用域,Bean生命周期
1.延迟加载 <bean id="p" class="com.Person" lazy-init="true"/> @Confi ...
- Nodejs+Express构建网站
1.预先安装(系统环境widows): nodejs 可在官网下载安装 https://nodejs.org/en/ visual studio code 可在官网下载安装 http://co ...
- [日常] Linux下的docker实践
1.Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC) 2.Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离 3.Docker 属 ...
- Java基础——GUI编程(四)
继前面的,这篇主要记录菜单和文件对话框的两个小练习,来熟悉一下方法的应用,一些简单的逻辑和Swing的相关简介,以及关于GUI基础的记录. 一.创建一个菜单 import java.awt.FlowL ...
- Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
目录 引言 Match Phase Query slop 参数 analyzer 参数 zero terms query Match Phrase 前缀查询 max_expansions 小结 参考文 ...
- 线程基础的一些理解(一)(java)
一.多线程的基本概念 线程是指进程中的一个执行场景,也就是执行流程,所以我们首先要聊一聊进程,以及进程和线程的关系 1.什么是进程? 一个进程对应一个应用程序,就像我们在windows系统中启动Wo ...
- Unix环境高级编程:守护进程
参考 Unix环境高级编程,第9,13章 介绍 守护进程就是Linux中使用ps aux那些一般以d结尾的程序,比如rsyslogd,sshd等,为daemon简称.他们是长期在后台执行的随终端关闭而 ...
- 获取url地址的参数值
使用频率很高,百度了记录一下 $.getUrlParam = function (name) { var reg = new RegExp("(^|&)" + name + ...
- 设计模式(21)--Strategy(策略模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而 ...