原文:asp.net读取CSV

用Excel导了两天数据,各种问题,折磨客户也折磨了自己,以前没发现的问题一下子都暴露出来了

特意收集两篇Excel跟CSV读取相关的两篇文章

asp.net读取excel文件,将excel文件先上传,在读取,最后删除。

但有一个问题,那就是excel文件夹需要有读写的权限,IIS需要为asp.net用户开通权限的。

而且excel文件本身存在安全隐患,那就是它可以运行vba程序。所以从安全角度考虑,上传excel是个不好的方法。

今天介绍另一种方法,读取CVS文件。

Step1.拖一个fileupload和button控件。

Step2.双击button,在button事件中写下列代码。

protected void btnUpload_Click(object sender, EventArgs e)

{

if (FileUploadCVS.HasFile)

{

if (System.IO.Path.GetExtension(FileUploadCVS.FileName) == ".csv")

{

DataTable dt = GetdataFromCVS(FileUploadCVS);

Step3. 写读取CVS文件的函数。

public static DataTable GetdataFromCVS(FileUpload fileload)

{

DataTable dt = newDataTable();

StreamReader sr = newStreamReader(fileload.PostedFile .InputStream);

string strTitle = sr.ReadLine();

string[] strColumTitle = strTitle.Split(',');   //CVS 文件默认以逗号隔开

for (int i = 0; i < strColumTitle.Length; i++)

{

dt.Columns.Add(strColumTitle[i]);

}

while (!sr.EndOfStream)

{

string strTest = sr.ReadLine();

string[] strTestAttribute = strTest.Split(',');

DataRow dr = dt.NewRow();

for (int i = 0; i < strColumTitle.Length; i++)

{

dr[strColumTitle[i]] = strTestAttribute[i];

}

dt.Rows.Add(dr);

}

return dt;

}

记得加上System.IO 命名空间。StreamReader 是在这个namespace下的。很多跟输入输出相关的累都在这个命名空间下

经常用到csv文件,一直用odbc进行读取,但是在unicode编码的时候读取不正确,有时候就算是ANSI编码,如一列数据混编,读取也不正确。不清楚是不是个人电脑的问题。只好自己写个来实现简单的读取,解析含","及"""号CSV文件。

更新1:使用中发现有些软件生存csv文件时,所有数据默认带有"",以前代码处理带引号空字段数据不正确。

代码如下,默认用UTF8编码,一次性读取整个CSV文件,若谁试用了此段代码,有问题请反馈给我,谢谢。

        /// <summary>
/// 读取csv文件到DataTable
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
static private DataTable ReadCsv(string filepath)
{
DataTable dt = new DataTable("NewTable");
DataRow row; string[] lines = File.ReadAllLines(filepath, Encoding.UTF8);
string[] head = lines[0].Split(',');
int cnt = head.Length;
for (int i = 0; i < cnt; i++)
{
dt.Columns.Add(head[i]);
}
for (int i = 0; i < lines.Length; i++)
{
lines[i].Trim();
if ((string.IsNullOrWhiteSpace(lines[i])))
{
continue;
}
try
{
row = dt.NewRow();
row.ItemArray = GetRow(lines[i], cnt);
dt.Rows.Add(row);
}
catch { }
}
return dt;
}
/// <summary>
/// 解析字符串 获取 该行的数据 已经处理,及"号
/// </summary>
/// <param name="line">该行的内容</param>
/// <param name="cnt">总的条目数</param>
/// <returns></returns>
static private string[] GetRow(string line, int cnt)
{
//line = line.Replace("\"\"", "\""); //若空数据加引号替换不正确
string[] strs = line.Split(',');
if (strs.Length == cnt)
{
return RemoveQuotes(strs);
}
List<string> list = new List<string>();
int n = 0, begin = 0;
bool flag = false; for (int i = 0; i < strs.Length; i++)
{ //没有引号 或者 中间有引号 直接添加
if (strs[i].IndexOf("\"") == -1
|| (flag == false && strs[i][0] != '\"'))
{
list.Add(strs[i]);
continue;
}
//其实有引号,但该段没有,号,直接添加
n = 0;
foreach (char ch in strs[i])
{
if (ch == '\"')
{
n++;
}
}
if (n % 2 == 0)
{
list.Add(strs[i]);
continue;
}
//该段有引号 有 ,号,下一段增加后添加
flag = true;
begin = i;
i++;
for (i = begin + 1; i < strs.Length; i++)
{
foreach (char ch in strs[i])
{
if (ch == '\"')
{
n++;
}
}
if (strs[i][strs[i].Length - 1] == '\"' && n % 2 == 0)
{
StringBuilder sb = new StringBuilder();
for (; begin <= i; begin++)
{
sb.Append(strs[begin]);
if (begin != i)
{
sb.Append(",");
}
}
list.Add(sb.ToString());
break;
}
}
}
return RemoveQuotes(list.ToArray());
}
/// <summary>
/// 将解析的数据 去除多余的引号
/// </summary>
/// <param name="strs"></param>
/// <returns></returns>
static string[] RemoveQuotes(string[] strs)
{
for (int i = 0; i < strs.Length; i++)
{
//若该项数据为空 但csv文件中加上双引号
if (strs[i] == "\"\"")
{
strs[i] = "";
continue;
}
//若该项数据头和尾加上引号
if (strs[i].Length > 2 && strs[i][0] == '\"' && strs[i][strs[i].Length - 1] == '\"')
{
strs[i] = strs[i].Substring(1, strs[i].Length - 2);
}
//若该项数据中间有引号
strs[i] = strs[i].Replace("\"\"", "\"");
}
return strs;
}
 

asp.net读取CSV的更多相关文章

  1. 【ASP.NET Core】MVC模型绑定:自定义InputFormatter读取CSV内容

    在上一篇文章中,老周介绍了用自定义 ModelBinder 的方式实现一个 API(或MVC操作方法)可以同时支持 JSON 格式和 Form-data 格式的数据正文.今天该轮到 InputForm ...

  2. asp.net读取excel文件多种方法

    asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取.   方法一:采用OleDB读取Excel文件 把Excel文件 ...

  3. 内容写到 csv 格式的文件中 及 读取 csv 格式的文件内容

    <?php/*把内容写到 csv 格式的文件中 基本思路是:1.用 $fp = fopen("filename", 'mode')打开一个csv文件,可以是打开时才建立的2. ...

  4. sparkR读取csv文件

    sparkR读取csv文件 The general method for creating SparkDataFrames from data sources is read.df. This met ...

  5. C# 读取 CSV 文件

    最近做一个C#项目要导入CSV文件中的数据到Oracle中,使用Aspose.Cells读取中文字段标题却乱码,表的最后多出几行null记录,而且不是免费的,后来找到了NPOI,顾名思义,就是POI的 ...

  6. PHP读取CSV数据写入数据库

    /*读取csv文件*/ public function testCsv(){ $fileName = "tel.csv"; $fp=fopen($fileName,"r& ...

  7. asp.net 读取一个文本文件,并输出到网页显示 通过 一般处理程序实现

    asp.net 读取一个文本文件,并输出到网页显示 通过 一般处理程序实现 用这个可以做模板首页进行输出,也可以自已自定义进行扩展 //得到读取到的文本到string中 string resultTe ...

  8. VB6.0 读取CSV文件

    最近做了一个Upload文件的需求,文件的格式为CSV,读取文件的方法整理了一下,如下: 1.先写了一个读取CSV文件的Function: '读取CSV文件 '假设传入的参数strFile=C:\Do ...

  9. php读取csv文件,在linux上出现中文读取不到的情况 解决方法

    今,php读取csv文件,在linux上出现中文读取不到的情况,google,后找到解决办法<?phpsetlocale(LC_ALL, 'zh_CN');$row = 1;$handle = ...

随机推荐

  1. DEMO阶段已完成,今天,要深入钻

    今天老师整理我的代码,发现,当时我没搞清楚这是正常的,由于我没有在一开始发挥到其翻译,而没有分析. 只要,研究底部是正确的.为了更好地理解代码. 上午:OSGEARTH视频教程. 上午,DX11机械仿 ...

  2. Redis被攻击

    记一次Redis被攻击的事件   最近几个月非常忙,所以很少有时间写博客,这几天终于闲了一些,于是就在整理平时的一些笔记.恰好这几天Redis服务器发生了问题,就记录一下. 我司有两款分别是2B和2C ...

  3. Linux下find命令具体解释

    1. find命令 linux的find命令用来查找文件,功能非常强大, 能够通过时间, 用户组, 文件名称, 文件类型, 权限,大小等来查找对应文件. 2. find的使用方法 通过find --h ...

  4. boostrap-非常好用但是容易让人忽略的地方------modal

    使用bootstrap框架好久了,在开发中也用到了或者遇到了很多的问题,所以跟大家分享一下 bootstrap modal 组件的样式 .modal-lg .modal-sm 说明:这个是bootst ...

  5. hdu4705 Y 简单树形DP 2013多校训练第十场 J题

    题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...

  6. uva 1534 - Taekwondo(dp+馋)

    题目连接:uva 1534 - Taekwondo 题目大意:有两组什么东西,题目背景有点忘记了,就是给出两组数,两组个数分别为n,m,要求找出min(n,m)对数.每一个数最多最多选一次,使得这mi ...

  7. 自己的包poi操作Excel工具

    在前面的文章<使用poi读写Excel>中分享了一下poi操作Excel的简单演示样例.这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完毕的功能是:读取Excel.汇总E ...

  8. JQuery插件开发初探——结构熟悉

    工作之余,对Jquery插件做了一点尝试,想着之前总用别人写的插件,自己要是也写一个用岂不是很cool.于是说干就干,动手开始写. 首先是模仿,从一个简单的功能进行入手,了解一下插件开发的流程和结构. ...

  9. UVALive 5099 Nubulsa Expo 全球最小割 非网络流量 n^3

    主题链接:点击打开链接 意甲冠军: 给定n个点m条无向边 源点S 以下m行给出无向边以及边的容量. 问: 找一个汇点,使得图的最大流最小. 输出最小的流量. 思路: 最大流=最小割. 所以题意就是找全 ...

  10. oracle_表分区

    一. 分区表理论知识 Oracle提供了分区技术以支持VLDB(Very Large DataBase).分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中.分区完全对应用透明. Orac ...