解析Csv文件并转化为DataTable(处理支付宝当面付账单)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mj_kk/article/details/76839525

最近在自己做一个小型对账系统,包括支付宝,微信,银联三个内容,因为支付宝当面付账单提供的接口是提供下载链接,然后下载一个压缩包,技术还没有那么高超,用代码解压,思路是:

1.通过接口,获取账单下载链接,通过下面代码访问网页,然后进行下载文件。

System.Diagnostics.Process.Start(url);

2.打开本地窗口,获取文件路径   

            string Route;  //路径            
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Multiselect = true;
            fileDialog.Title = "请选择文件";
            fileDialog.Filter = "所有文件(*.*)|*.*";
            if (fileDialog.ShowDialog() == DialogResult.OK)
            {
                Route = fileDialog.FileName;
                try
                {
                    zfb_dt = re.OpenCSVFile(Route);
                    dgv1.DataSource = zfb_dt;
                    label5.Text = "支付宝";
                    mode.zfb_dt = zfb_dt;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("选择文件格式不规范,请选择“业务明细”文件!");
                }
            }
            else
            {
                MessageBox.Show("未选择文件");
            }
ps:因为支付宝账单有两个文件,分别是:业务明细和业务明细(汇总),两个文件的Csv格式是不同的。

3.通过文件路径,解析Csv文件,转化为dataTabel

Csv文件格式:


代码如下

 public DataTable OpenCSVFile(string filepath)
        {
            DataTable zfb_dt = new DataTable();
            bool blnFlag = true;
            DataColumn dc;
            DataRow dr;
            string[] aryline;
            StreamReader mysr = new StreamReader(filepath, System.Text.Encoding.Default);
            string strline;
            int a = 0;
            while ((strline = mysr.ReadLine()) != null)
            {
                aryline = strline.Split(new char[] { ',' });
                int intColCount = aryline.Length;
                if (intColCount > 1)//列数超过1
                {
                    //给datatable加上列名
                    if (blnFlag)
                    {
                        blnFlag = false;

                        for (int i = 0; i < intColCount; i++)
                        {
                            dc = new DataColumn(aryline[i].ToString());
                            zfb_dt.Columns.Add(dc);
                        }
                    }
                    //捞出Csv文件的列标题,但是在内容中不显示
                    if (a == 1)
                    {
                        //填充数据并加入到datatable中
                        dr = zfb_dt.NewRow();
                        for (int i = 0; i < intColCount; i++)
                        {
                            dr[i] = aryline[i];
                        }
                        zfb_dt.Rows.Add(dr);
                    }
                    a = 1;
                }
            }
            //只显示datatable其中需要的几列字段
            DataTable dt = zfb_dt.DefaultView.ToTable(false, new string[] { "商户订单号", "商品名称", "业务类型", "商家实收(元)", "完成时间" });
            return dt;
        }

总结:主要就是将csv中的数据转化为特定编码的字符。然后每次读取一行,并找出想要的行,进行处理,循环保存为dataTable中的行。

如果大家有更好的方法,希望可以在评论中留下,相互学习,谢谢。

如果此博客对你有帮助或者还有什么疑问,大家都可以在评论中一起讨论,谢谢。

猜你喜欢

转载自blog.csdn.net/Mj_kk/article/details/76839525