NetCore利用CsvHelper解析支付宝对账单
支付宝账单是zip压缩文件流,里面包含了两个.csv文件。
1.请求支付宝账单下载链接,获取到zip文件流。
var httpClient = _clientFactory.CreateClient();
var stream = await httpClient.GetStreamAsync(response.BillDownloadUrl);//获取流
string extractPath = $@"{_hostingEnvironment.ContentRootPath}/file/alipay";//需要解压到的文件夹路径
if (!extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
extractPath += Path.DirectorySeparatorChar;
//获取zip内容。GB2312需要在 Program Main方法中注册: System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Read, true, System.Text.Encoding.GetEncoding("GB2312")))
{
foreach (var item in archive.Entries)
{
string destinationPath = Path.GetFullPath(Path.Combine(extractPath, item.FullName));
item.ExtractToFile(destinationPath, true);//解压到指定文件夹,true代表覆盖原有的文件
}
}
2.解析csv文件
支付宝对账单中,其中xxx_业务明细.csv格式如下:
#支付宝业务明细查询
#账号:[xxxxxxxxx]
#起始日期:[2019年08月01日 00:00:00] 终止日期:[2019年08月02日 00:00:00]
#-----------------------------------------业务明细列表----------------------------------------
支付宝交易号,商户订单号,业务类型,商品名称,创建时间,完成时间,门店编号,门店名称,操作员,终端号,对方账户,订单金额(元),商家实收(元),支付宝红包(元),集分宝(元),支付宝优惠(元),商家优惠(元),券核销金额(元),券名称,商家红包消费金额(元),卡消费金额(元),退款批次号/请求号,服务费(元),分润(元),备注
xxxxxxx ,xxxxxxx ,交易 ,1,2019-08-01 18:50:14,2019-08-01 18:50:18, , , , ,*渠(131****81) ,1.00,1.00,0.00,0.00,0.00,0.00,0.00,,0.00 ,0.00, ,-0.01,0.00,1
xxxxxxx ,xxxxxxx ,退款 ,1,2019-08-01 18:50:14,2019-08-01 19:09:31, , , ,1 ,*渠(131****81) ,-1.00,-1.00,0.00,0.00,0.00,0.00,0.00,,0.00 ,0.00,xxxxxxx ,0.01,0.00,1
#-----------------------------------------业务明细列表结束------------------------------------
#交易合计:4笔,商家实收共1.03元,商家优惠共0.00元
#退款合计:1笔,商家实收退款共-1.00元,商家优惠退款共0.00元
#导出时间:[2019年08月02日 05:28:48]
发现其说明的行都是以 # 开头,可按此过滤
使用CsvHelper读取文件:(CsvHelper需要在nuget上安装)
//这里直接读取zip文件中的流item.Open(),亦可以读取文件。具体用法可参考CsvHelper官方文档
using (TextReader reader = new StreamReader(item.Open(), System.Text.Encoding.GetEncoding("GB2312")))
{
using (var csv = new CsvReader(reader))
{
csv.Configuration.RegisterClassMap<AliPayBillMap>();//AliPayBillMap是自定义的map,在下文贴出
var aliPayBills = new List<Model.AliPayBill>();
var isHeader = true;
while (csv.Read())
{
if (!csv.GetField().StartsWith('#'))//过滤#开头的行
{
if (isHeader)//读取表头
{
csv.ReadHeader();
isHeader = false;
continue;
}
aliPayBills.Add(csv.GetRecord<Model.AliPayBill>());//映射
}
}
}
}
csv文件的表头跟属性的mapper关系,CsvHelper提供了多种方法。可以根据表头index,也可以根据表头列名。这里采用列名:
public class AliPayBill
{
/// <summary>
/// 支付宝交易号
/// </summary>
public string TradeNo { get; set; } /// <summary>
/// 商户订单号
/// </summary>
public string OrderNo { set; get; }
}
public class AliPayBillMap : ClassMap<AliPayBill>
{
public AliPayBillMap()
{
Map(x => x.TradeNo).Name("支付宝交易号");
Map(x => x.OrderNo).Name("商户订单号");
//.....这里只举例两个属性。
}
}
注意:获取到的数据,可能包含\t,请做相应的处理。
NetCore利用CsvHelper解析支付宝对账单的更多相关文章
- Android利用Jsoup解析html 开发网站客户端小记。
这些天业余时间比较多,闲来无事,想起了以前看过开发任意网站客户端的一篇文章,就是利用jsoup解析网站网页,通过标签获取想要的内容.好了废话不多说,用到的工具为 jsoup-1.7.2.jar包,具体 ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- 利用XPath解析带有xmlns的XML文件
在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中 ...
- java中利用dom4j解析XML文件
官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回Li ...
- IOS开发---菜鸟学习之路--(二十一)-利用正则表达式解析URL获取其中的参数
因为项目需要解析URL当中参数的部分,在网上搜索了一下都没有相关的资料. 然后就自己写了一个 其实我就是通过正则表达式来处理URL 进行解析的 好了直接上代码吧 也是非常的简单,大家拷贝过去就可以使用 ...
- Xml学习笔记(3)利用递归解析Xml文档添加到TreeView中
利用递归解析Xml文档添加到TreeView中 private void Form1_Load(object sender, EventArgs e) { XmlDocument doc = new ...
- 在java项目中怎样利用Dom4j解析XML文件获取数据
在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进 ...
- 利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4
利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4 以前看视频的时候,直接找到 video标签,查看视频地址,然后下载下来.. 后来发现,好多 video 标签打开元素审查,如下 ...
- Apache Common-collection 反序列化利用链解析--TransformedMap链
Apache Common-collection 反序列化利用链解析 TransformedMap链 参考Java反序列化漏洞分析 - ssooking - 博客园 (cnblogs.com) poc ...
随机推荐
- java 调用DB2 SYSPROC.ADMIN_CMD存储过程导出数据
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import ...
- casperjs-options
The Casper class The easiest way to get a casper instance is to use the module's create() method: 最简 ...
- 【记录】vue相关知识点
let let是es6新引入的命令,与var命令类似,但是let是声明的局部变量,只在所在代码块中有效. ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. var s = ...
- CNN基础三:预训练模型的微调
上一节中,我们利用了预训练的VGG网络卷积基,来简单的提取了图像的特征,并用这些特征作为输入,训练了一个小分类器. 这种方法好处在于简单粗暴,特征提取部分的卷积基不需要训练.但缺点在于,一是别人的模型 ...
- Es学习第六课, ES基本搜索_search
前面几课ES的基本概念.安装和分词都讲过了,下面我们就来实战一下ES的核心功能-搜索,这节课我们主要讲的是基本搜索 _search(注意:ES的关键字都要加前缀_,所以我们在定义索引.类型名称时不要带 ...
- vue video全屏播放
需求: 1.视频为长方形,页面初始化打开为横屏全屏播放视频. 2.微信不支持自动播放,故自动播放需求删除. 方法: 1.vue-video-player插件 因需求较简单,仅要求播放本地一个视频,故未 ...
- printf 输出格式设置\033[47\033[5m 与-8.8s
摘要:在使用linux终端命令的时候,我们可以看到像more命令,它的显示方式与一般的字符串不同,是用了反显.同样,linux C下printf还有很多其他不常见的格式化输出形式.本文主要为你盘点这些 ...
- Delphi正则表达式使用方法(TPerlRegEx)
目前主流的delphi下的正则表达式,应该是 PerlRegEx . 官方网站: http://www.regular-expressions.info/delphi.html 直接下载: ht ...
- [Repost] 悬线法
<浅谈用极大化思想解决最大子矩形问题>作者:王知昆 首先,根据定理1:最大有效子矩形一定是一个极大子矩形.不过与前一种算法不同的是,我们不再要求每一次枚举的一定是极大子矩形而只要求所有的极 ...
- 【计算机网络mooc】二、物理层
1.物理层基本概念 物理层只考虑传输bit流,不包括网线等传输媒体(可认为是第0层),屏蔽传输媒体的差异,不同的传输媒体定义不同标准. 主要任务:确定与传输媒体的接口的特性. 机械特性:网线上面的水晶 ...