1. 程式人生 > >解析Csv檔案並轉化為DataTable(處理支付寶當面付賬單)

解析Csv檔案並轉化為DataTable(處理支付寶當面付賬單)

最近在自己做一個小型對賬系統,包括支付寶,微信,銀聯三個內容,因為支付寶當面付賬單提供的介面是提供下載連結,然後下載一個壓縮包,技術還沒有那麼高超,用程式碼解壓,思路是:

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中的行。

如果大家有更好的方法,希望可以在評論中留下,相互學習,謝謝。

如果此部落格對你有幫助或者還有什麼疑問,大家都可以在評論中一起討論,謝謝。