csv导入文件会把每列的数据用英文逗号分割开来,如果遇到某列中包含英文逗号,则会把该列用英文双引号进行包装。

如果csv文件中某列的数据本身包含英文逗号,应该使用读取字符串的方式进行解析数据,如csv的数据如下,ReGoodsCode,SKUCode,PlatformCode,GoodsName,GoodsCount,RefundAmount,Phone,MallID,UserName,ReTime
1.56E+14,xg003809216-z,4M天猫旗舰店,"4M ,,高曼",5,500,13907927272,"匿名用户,lisi","张三,xxx,ooo",2014/12/23 14:10

这时应用如下方法进行解析数据,

private IEnumerable<string[]> ExCsv1(string path)
        {
            var sr = File.ReadAllLines(path, System.Text.Encoding.UTF8);
            int i = 0, m = 0;

for (var a = 1; a < sr.Length; a++)
            {
                string[] split = sr[a].Split(',');
                string[] newsplit = new string[split.Length];
                var fix = 0;

for (i = 0; i + fix < split.Length; i++)
                {
                    newsplit[i] = split[i + fix];
                    if (newsplit[i].StartsWith("\"") && !newsplit[i].EndsWith("\""))
                    {
                        for (var j = i + fix + 1; j < split.Length; j++, fix++)
                        {
                            newsplit[i] += "," + split[j];
                            if (split[j].EndsWith("\"")) break;
                        }
                    }
                }
                yield return newsplit;
            }
        }

使用时,

if (FileUpload1.HasFile)
            {
                try
                {
                    //FileUpload1.SaveAs(Server.MapPath("upload") + "\\" + FileUpload1.FileName);
                    //这里永远只保存一个文件
                    string path = ConfigurationManager.AppSettings["ReturnGoodsPath"];
                    FileUpload1.SaveAs(path + FileUpload1.FileName);
                    var dt = ExCsv1(path + FileUpload1.FileName);
                    //DataTable dt = csv2dt(path + FileUpload1.FileName, 1);
                    //var codeisInt = dt.Columns[0].DataType == typeof(int) || dt.Columns[0].DataType == typeof(double);

//绑定数据源
                    //GridView1.DataSource = dt;
                    //GridView1.DataBind();

var msg = "客户端路径:" + FileUpload1.PostedFile.FileName + "<br>" +
                    "文件名:" + System.IO.Path.GetFileName(FileUpload1.FileName) + "<br>" +
                    "文件扩展名:" + System.IO.Path.GetExtension(FileUpload1.FileName) + "<br>" +
                    "文件大小:" + FileUpload1.PostedFile.ContentLength + " KB<br>" +
                    "文件MIME类型:" + FileUpload1.PostedFile.ContentType + "<br>" +
                    "保存路径:" + Server.MapPath("upload") + "\\" + FileUpload1.FileName;

List<ReOrder> r = new List<ReOrder>();
                    foreach (var item in dt)
                    {
                        string orderCode = item[0].ToString();// codeisInt ? ((double)item[0]).ToString("D") : item[0].ToString();
                        string productCode = item[1].ToString();
                        ReOrder ord = r.Where(t => t.Code == orderCode).FirstOrDefault();

if (ord == null)
                        {
                            ord = new ReOrder();
                            ReOrderDetail det = new ReOrderDetail();

ord.Code = orderCode;// item[0].ToString();
                            det.SKUCODE = item[1].ToString();
                            ord.PlatformCode = item[2].ToString();
                            det.GoodsName = item[3].ToString();
                            det.GoodsCount = int.Parse(item[4].ToString());
                            ord.TotalAmount = decimal.Parse(item[5].ToString());
                            det.TotalAmount = decimal.Parse(item[5].ToString());
                            ord.phone = item[6].ToString();
                            ord.MallID = item[7].ToString();
                            ord.UserName = item[8].ToString();
                            ord.ReGoodsTime = DateTime.Parse(item[9].ToString());
                            ord.ReOrderDetails.Add(det);
                            r.Add(ord);
                        }
                        else if (!ord.ReOrderDetails.Any(d => d.SKUCODE == productCode))
                        {
                            ReOrderDetail det = new ReOrderDetail();
                            det.SKUCODE = item[1].ToString();
                            det.GoodsName = item[3].ToString();
                            det.GoodsCount = int.Parse(item[4].ToString());
                            det.TotalAmount = decimal.Parse(item[5].ToString());
                            ord.TotalAmount = ord.TotalAmount + decimal.Parse(item[5].ToString());
                            ord.ReOrderDetails.Add(det);
                        }
                    }

var returnGoodsGroups = r.GroupBy(x => x.phone).ToArray();

foreach (var item in returnGoodsGroups)
                    {

LogEntry entry = new LogEntry("返回退货", 1);
                        LogStub.Log(entry);
                        var res = await LogicStub.ReturnGoodsHandler.HandleReturnGoods(new SDK.ReturnGoodsInfo
                           {
                               Orders = item.ToList(),
                               MemberKeyValue = item.Key
                           });
                        msg += "<br/>" + res;// == "{}" ? "<br/>OK!" : "<br/>" + res;

}
                    Label1.Text = msg;
                }
                catch (Exception ex)
                {
                    Label1.Text = "发生错误:" + ex.Message.ToString();
                }
            }

也可以使用以下方法获取数据,但此方法可能无法解决列数据中包含英文逗号的问题:

/// <summary>
        /// CSV文件转换
        /// 作为数据源
        /// </summary>
        /// <returns></returns>
        private DataTable ExCsv(string path)
        {
            // csv file:HDR=Yes-- first line is header
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path
                + ";Extended Properties='TEXT;HDR=Yes;FMT=Delimited;CharacterSet=65001;'";
            OleDbConnection oleConn = new OleDbConnection(strConn);
            oleConn.Open();
            DataTable sheets = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            DataTable dt = new DataTable();
            if (sheets != null && sheets.Rows.Count > 0)
            {
                String fileName = sheets.Rows[0]["TABLE_NAME"].ToString(); // sheets.Rows[0] -- first sheet of excel 
                string olestr = "select * from [" + fileName + "]";
                OleDbCommand oleComm = new OleDbCommand(olestr, oleConn);
                oleComm.Connection = oleConn;
                OleDbDataAdapter oleDa = new OleDbDataAdapter();
                oleDa.SelectCommand = oleComm;
                oleDa.Fill(dt);
                oleConn.Close();
            }
            return dt;
        }

调用时,

if (FileUpload1.HasFile)
            {
                    //FileUpload1.SaveAs(Server.MapPath("upload") + "\\" + FileUpload1.FileName);
                    //这里永远只保存一个文件
                    string path = ConfigurationManager.AppSettings["ReturnGoodsPath"];
                    FileUpload1.SaveAs(path + FileUpload1.FileName);
                    DataTable dt = ExCsv(path);

//绑定数据源
                    //GridView1.DataSource = dt;
                    //GridView1.DataBind();

Label1.Text = "客户端路径:" + FileUpload1.PostedFile.FileName + "<br>" +
                    "文件名:" + System.IO.Path.GetFileName(FileUpload1.FileName) + "<br>" +
                    "文件扩展名:" + System.IO.Path.GetExtension(FileUpload1.FileName) + "<br>" +
                    "文件大小:" + FileUpload1.PostedFile.ContentLength + " KB<br>" +
                    "文件MIME类型:" + FileUpload1.PostedFile.ContentType + "<br>" +
                    "保存路径:" + Server.MapPath("upload") + "\\" + FileUpload1.FileName;

}

读取上传的CSV为DataTable的更多相关文章

  1. Springboot/SpringMvc 读取上传 xls 文件内容

    /** * 读取上传 xls 内容返回 * @param file * @return */@RequestMapping(value = "/read.xls")@Respons ...

  2. File API 读取上传的文件

    1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...

  3. HTML5 读取上传文件(转载)

    另参考 http://www.jianshu.com/p/46e6e03a0d53 1 filelist对象与file对象: <input type="file" id=&q ...

  4. ci框架读取上传的excel文件数据

    原文链接: https://blog.csdn.net/qq_38148394/article/details/87921373 此功能实现使用到PHPExcel类库,PHPExcel是一个PHP类库 ...

  5. 上传文件csv 导入功能

    HTML代码: <script> function uploadCsv() { $('#chooseCsvFile').click(); } function doUploadCsv() ...

  6. webapi读取上传的文件流

    逻辑说明 这里未引用System.Web.Mvc. 主要使用MultipartMemoryStreamProvider对象从Request中获取文件流. var provider = new Mult ...

  7. .NET 上传并解析CSV文件存库

    1.前端: 放置浏览按钮 <div class="row inner_table text-center"> <input id="fileId&quo ...

  8. php上传excle文件,csv文件解析为二维数组

    解析上传的CSV文件不是什么难事,直接读取转成你想要的数组样子就OK了. public function putStoreStockIn ($filePath = '') { $file = fope ...

  9. .net网站的文件上传读取进度条和断点下载

    文件上传到服务器时的进度读取 //调整上传配置 AdapterInfo(info); UpfileResult result = new UpfileResult(); try { //直接使用req ...

随机推荐

  1. emeditor 配置教程

    1.众多的图形界面配置功能 通过查看EmEditor的安装目录,可以发现,EmEditor有几个配置文件,理论上应该可以通过修改配置文件来达到配置EmEditor的目 的.然而,打开配置文件一看,如果 ...

  2. 无阻塞情况connect生产EINPROGRESS错

    今天的游戏开发client测试程序,非常多,因为出现client.后connect成功.代码证recv系统调用.后来发现,可能是由于socket默认模式被阻止,这将使很多client 接处于链接却不能 ...

  3. 一份关于jvm内存调优及原理的学习笔记

    JVM 一.虚拟机的基本结构 1.jvm整体架构 类加载子系统:负责从文件系统或者网络中加载class信息,存入方法区中. 方法区(Perm):存放加载后的class信息,包括静态方法,jdk1.6以 ...

  4. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第7章节--打包并部署SP2013 Apps 打包并公布App

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第7章节--打包并部署SP2013 Apps 打包并公布App         如今既然你理解了一个app的四个主要部分, ...

  5. client多线程

    1.多线程对象 对象可以是多线程访问,线程可以在这里分为两类: 为完成内部业务逻辑的创建Thread对象,线程需要访问对象. 使用对象的线程外部对象. 进一步假设更精细的划分.业主外螺纹成线等线,. ...

  6. Cocos2d-x场景变化相关功能介绍

    现场由导演级交换机Director实现.之间的相关的功能,如下面: runWithScene(Scene* scene).该函数能够执行场景.仅仅能在启动第一个场景时候调用该函数.假设已经有一个场景执 ...

  7. iOS开发:多线程技术概述

    一.概述 线程(thread):用于指代独立执行的代码段. 进程(process):用于指代一个正在运行的可执行程序,它可以包含多个线程. 任务(task):用于指代抽象的概念,表示需要执行工作. 多 ...

  8. Objective-C开发编码规范

    Objective-C 编码规范,内容来自苹果.谷歌的文档翻译,自己的编码经验和对其它资料的总结. 概要 Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程 ...

  9. JAVA中的I/O流以及文件操作

    一 JAVA语言中主要通过流来完成IO操作. 流:计算机的输入输出之间流动的数据序列,也是类的对象.java中的流方式就像是建立在数据交换源和目的之间的一条通信路径. 数据源:计算机中的数据源是指可以 ...

  10. leetcode文章137称号-Single Number II

    #include<stdio.h> #include<stdlib.h> int singleNumber(int* nums, int numsSize) { int cou ...