读取上传的CSV为DataTable
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的更多相关文章
- Springboot/SpringMvc 读取上传 xls 文件内容
/** * 读取上传 xls 内容返回 * @param file * @return */@RequestMapping(value = "/read.xls")@Respons ...
- File API 读取上传的文件
1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...
- HTML5 读取上传文件(转载)
另参考 http://www.jianshu.com/p/46e6e03a0d53 1 filelist对象与file对象: <input type="file" id=&q ...
- ci框架读取上传的excel文件数据
原文链接: https://blog.csdn.net/qq_38148394/article/details/87921373 此功能实现使用到PHPExcel类库,PHPExcel是一个PHP类库 ...
- 上传文件csv 导入功能
HTML代码: <script> function uploadCsv() { $('#chooseCsvFile').click(); } function doUploadCsv() ...
- webapi读取上传的文件流
逻辑说明 这里未引用System.Web.Mvc. 主要使用MultipartMemoryStreamProvider对象从Request中获取文件流. var provider = new Mult ...
- .NET 上传并解析CSV文件存库
1.前端: 放置浏览按钮 <div class="row inner_table text-center"> <input id="fileId&quo ...
- php上传excle文件,csv文件解析为二维数组
解析上传的CSV文件不是什么难事,直接读取转成你想要的数组样子就OK了. public function putStoreStockIn ($filePath = '') { $file = fope ...
- .net网站的文件上传读取进度条和断点下载
文件上传到服务器时的进度读取 //调整上传配置 AdapterInfo(info); UpfileResult result = new UpfileResult(); try { //直接使用req ...
随机推荐
- Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算(转)
Java 系统性能分析 命令 1. cpu分析 top , pidstat(sysstat) pid -p PID -t 1 10 vmstat 1 CPU上下文切换.运行队列.利用率 ps Hh - ...
- Leetcode:minimum_depth_of_binary_tree解决问题的方法
一. 称号 并寻求最深的二元相似.给定的二进制树.求其最小深度. 最小深度是沿从根节点,到叶节点最短的路径. 二. 分析 当我看到这个题目时.我直接将最深二叉树的代码略微改了下,把ma ...
- redis预切片技术,实现
平时,我们将创建多个redis实例,以缓解单redis压力范例.但,作为高速缓存的数量增加.对redis对于扩展是一种非 - 不要无所谓.对redis有几种方法用于扩张可能.让我们添加每个redis最 ...
- Linux 环境下 Lua 安装(转)
系统环境:CentOS-6.2-x86_64. Lua 是嵌入式脚本语言,应用场景很广泛. 引自官网:Lua is used in many products and projects around ...
- Code::Blocks项目配置基础
File 菜单 New :新建( Empty file/file . class . project . build target ) . Recent projects/files :近期打开的项目 ...
- 介绍一款轻量级js控件:easy.js
easy.js 组件高速入门 在使用 easy.js 的组件之前,假设能花上几分钟看看以下的一些简单的入门指南,在使用组件的时候你会更加的得心应手. 简单性 easy.js 的组件在 UI(界面) 层 ...
- Android网络图片显示在ImageView 上面
在写这篇博文的时候,我參与了一个项目的开发,里面涉及了非常多网络调用相关的问题,我记得我在刚刚開始做android项目的时候,以前就遇到这个问题,当时在网上搜索了一下,发现了一篇博文,如今与大家分享一 ...
- iOS_24_画画板(含取色板)
终于效果例如以下: 一.简单说明 1.使用一个数组 strokesArr(笔画数组)记录全部笔画.数组中保存的是一个个的笔画字典,一个字典就是一个笔画.笔画字典中有三项:笔画的大小.颜色.points ...
- 写hive sql和shell脚本时遇到几个蛋疼的问题!
错误一: Hive的where后不能用字段的别名, 错误二: hive的groupby中不能用自己定义函数,否则报错(用嵌套select取代) 错误三: 运行:$ ./hive_game_operat ...
- 2014年度辛星全然解读html第七节
经过前面六节的学习,我们大致清楚了HTML教程中的基础内容,那么接下来我们開始继续向后推进,能够说,以下我们介绍一下HTML中的区块. ***************区块*************** ...