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;
        }
时间: 2024-10-09 09:07:26

asp.net读取CSV的相关文章

asp.net读取CSV-千分之想

用Excel导了两天数据,各种问题,折磨客户也折磨了自己,以前没发现的问题一下子都暴露出来了 特意收集两篇Excel跟CSV读取相关的两篇文章 asp.net读取excel文件,将excel文件先上传,在读取,最后删除. 但有一个问题,那就是excel文件夹需要有读写的权限,IIS需要为asp.net用户开通权限的. 而且excel文件本身存在安全隐患,那就是它可以运行vba程序.所以从安全角度考虑,上传excel是个不好的方法. 今天介绍另一种方法,读取CVS文件. Step1.拖一个file

Asp.Net 读取Excel内容超过255个字符被截断

.csv类型的单元格不能超过255,要转成xls格式 Asp.Net 读取Excel内容超过255个字符被截断,这问题很莫名其妙的,有时候是单元格直接被截断,有时候是C#操作读取时被截断,要想好好导入,也不容易.... 当单元格复制字符串或导入时,字符串就被截断,注意新建Excel的文件保存类型,多试几个相关类型试试; C#操作读取时被截断,如果查看单元格字符串是对的,那看看是不是以下的问题: 用Ado读取数据时,对于超过255个字符的单元格,必须在前1-8列,大于255个字符的单元格第一行数据

Python 读取csv的某行

站长用Python写了一个可以提取csv任一列的代码,欢迎使用.Github链接 csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以存储为csv文件,文件内容是:No.,Name,Age,Score1,Apple,12,982,Ben,13,973,Celia,14,964,Dave,15,95假设上述csv文件保存为"A.csv",如何用Python像操作Excel一样提取其中的一行,也就是一条记录,利用Python自

sparkR读取csv文件

sparkR读取csv文件 The general method for creating SparkDataFrames from data sources is read.df. This method takes in the path for the file to load and the type of data source, and the currently active SparkSession will be used automatically. SparkR suppo

PHP读取CSV大文件导入数据库的示例

对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象. 为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的. 下面这个函数是读取CSV文件中指定的某几行数据: /** * csv_get_lines 读取CSV文件中的某几行数据 * @param $csvfile csv文件路径 * @param $lines 读取行数 * @param $offset 起始行数 * @return array * */ function csv_get

php读取csv文件类

php处理csv文件类: http://www.php100.com/cover/php/540.html <?php define("CSV_Start", 0); define("CSV_Quoted", 1); define("CSV_Quoted2", 2); define("CSV_Unquoted", 3); function readCSV($fh, $len, $delimiter = ',', $enc

Asp.Net 读取xml文件中Key的值,并且过滤掉注释内容代码

/// <summary> /// 读取配置文件keys /// </summary> /// <returns></returns> public string _GetKeys() { string filename = Server.MapPath("/") + @"web.config"; XmlDocument xmldoc = new XmlDocument(); XmlReaderSettings set

读取csv文件,写入oracle数据库

/* * @(#)DataParse.java 2014年4月28日 */ package com.yihaodian.sa.doData; import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.sql.Connection;import java.

用程序读取CSV文件的方法

CSV全称 Comma Separated values,是一种用来存储数据的纯文本文件格式,通常用于电子表格或数据库软件.用Excel或者Numbers都可以导出CSV格式的数据. CSV文件的规则 0 开头是不留空,以行为单位.1 可含或不含列名,含列名则居文件第一行. 2 一行数据不垮行,无空行. 3 以半角符号,作分隔符,列为空也要表达其存在. 4 列内容如存在,,则用""包含起来. 5 列内容如存在""则用""""包