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对象的代码的更多相关文章

  1. csv文件与DataTable互相导入处理

    封装处理下,以后项目用到可以直接使用,比较简单. 1.首先看封装好的类 using System; using System.Data; using System.IO; using System.T ...

  2. mongodb-导出数据到csv文件或json文件

    在mongodb的bin目录下, 有一个mongoexport, 可用于数据的导出 [wenbronk@localhost bin]$ ./mongoexport --help Usage: mong ...

  3. c# 将csv文件转换datatable的两种方式。

    第一种: public static DataTable csvdatatable(string path) { DataTable dt = new DataTable(); string conn ...

  4. javascript导出csv文件(excel)

    这里贴出JavaScript导出csv文件(excel)的代码. /** * 导出excel * @param {Object} title 标题列key-val * @param {Object} ...

  5. python爬取当当网的书籍信息并保存到csv文件

    python爬取当当网的书籍信息并保存到csv文件 依赖的库: requests #用来获取页面内容 BeautifulSoup #opython3不能安装BeautifulSoup,但可以安装Bea ...

  6. java将数据生成csv文件

    1,httpRequest接口触发进程[或者可以换成其他方式触发] /** * 出入库生成CSV文件 * @param req * @param params * @return */@Request ...

  7. C语言读取写入CSV文件 [一]基础篇

    本系列文章目录 [一] 基础篇 [二] 进阶篇--写入CSV [三] 进阶篇--读取CSV 什么是CSV? CSV 是一种以纯文本形式存储的表格数据,具体介绍如下(来自维基百科): 逗号分隔值(Com ...

  8. C# .csv文件转为Excel格式;Excel格式转换为.csv

    using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windo ...

  9. SQL Server:把CSV文件导入到SQL Server表中

    有时候我们可能会把CSV中的数据导入到某个数据库的表中,比如做报表分析的时候. 对于这个问题,我想一点也难不倒程序人员吧!但是要是SQL Server能够完成这个任务,岂不是更好! 对,SQL Ser ...

随机推荐

  1. V8源码边缘试探-黑魔法指针偏移

    这博客是越来越难写了,参考资料少,难度又高,看到什么写什么吧! 众多周知,在JavaScript中有几个基本类型,包括字符串.数字.布尔.null.undefined.Symbol,其中大部分都可以在 ...

  2. js 中格式化时间

    在js中常常要求对时间的输出格式进行格式化,比如 2017-01-01 10:10,比较麻烦的是月,日,小时,分.它们的格式一般要求两位,如果小于10的话需要在前边补0,当然这算不上什么问题,可以通过 ...

  3. git命令学习总结

    学习git 主要是因为github官网共享的资源很有学习价值.最近转型JAVA,所有特意去学习了下git软件.git软件可以去官网下载最新版本. 进入 git 仓库目录 右击 选中 Git Bash ...

  4. abp运行机制分析

    abp运行流程 由于公司现在大量向abp框架+react前后端分离架构转型,所以有必要分析abp框架是如何在iis运行的,所以才有这篇文章 public class MvcApplication : ...

  5. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)

    想想面试的时候很多会问jvm这方面的问题虽然还是菜鸟不太能用到现在但是还是了解一下, 找资料的时候看见个大佬写的很好转载到这方便以后自己复习和给大佬做宣传 以下为大佬的博客原文: 这两天看了一下深入浅 ...

  6. Java基础——iO(二)

    接着上一篇,继续做学习笔记.学IO这块,突然找到一点好处,好像以后操作电脑,尤其是电脑里的文件啥的,可以很少的用鼠标了.添加.修改.删除啥的,几行代码就可以搞定了.这只是我一个初学者的一点小心思,IO ...

  7. BestCoder Round #27

    Jump and Jump... Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. shell_语法

    1.运算符: 1.基本语法:$((运算式))或$[运算式] 2.expr + n // 注意运算符中间有空格 再用expr时要加 ` ` 号,* 号加转义字符\  \* ,表示乘 2.判断语句 [ c ...

  9. 语音识别(ASR) 阿里云

    做语音识别这块的呢,国内领先的有科大讯飞,BAT这几家公司,鉴于使用科大讯飞的接口需要付费,腾讯云的语音识别申请了几天也没给通过,比较了一下阿里和百度的,个人觉得阿里云的好用一些,这篇博客来讲讲怎么讲 ...

  10. Linux 安装Python虚拟环境,virtualenvwrapper

    virtualenvwrapper工具学习 1.因为virtualenv 工具使用的并不方便 2.安装virtualenvwrapper pip3 install -i https://pypi.do ...