【程式設計-C#】開啟CSV資料檔案(.csv)並處理資料

【教學目的】

我們要讀入如下的資料,此資料檔以逗點分隔資料,我們要將資料一行一行讀出來(放在一個字串),並且以逗點方式將資料分開(字串陣列)。

【第一個畫面】未分割資料

【第二個畫面】分割資料

成績檔下載:成績檔

陳X鈴,75,70,75,75
劉X如,75,70,75,75
王X玲,75,70,75,75
黃X如,80,85,90,60
林X君,65,80,95,70
張X惠,65,80,70,65
王X琪,80,70,65,75
余X芬,70,80,50,70
周X誼,80,80,90,65
黃X儀,80,80,90,65
陳X妙,80,80,75,75
黃X蓮,80,80,85,65
顏X芳,80,70,90,65
張X洲,75,80,90,75
王X聰,65,70,75,45
胡X虹,20,80,70,65
~~以下 省略~~

【程式碼】

專案檔下載:openCSV

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            tbResult.Text = "";
            // 建立一個OpenFileDialog物件
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            // 設定OpenFileDialog屬性
            openFileDialog1.Title = "選擇要開啟的CSV檔案";
            openFileDialog1.Filter = "CSV Files (.csv)|*.csv|All Files (*.*)|*.*";
            openFileDialog1.FilterIndex = 1;

            openFileDialog1.Multiselect = true;

            // 喚用ShowDialog方法,打開對話方塊

            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {                
                string theFile = openFileDialog1.FileName; //取得檔名
                Encoding enc = Encoding.GetEncoding("big5"); //設定檔案的編碼
                string[] readText = System.IO.File.ReadAllLines(theFile, enc); //以指定的編碼方式讀取檔案
                foreach (string s in readText)
                {
                    tbResult.Text += s + "\r\n";
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            tbResult.Text = "";
            // 建立一個OpenFileDialog物件
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            // 設定OpenFileDialog屬性
            openFileDialog1.Title = "選擇要開啟的CSV檔案";
            openFileDialog1.Filter = "CSV Files (.csv)|*.csv|All Files (*.*)|*.*";
            openFileDialog1.FilterIndex = 1;

            openFileDialog1.Multiselect = true;

            // 喚用ShowDialog方法,打開對話方塊

            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string theFile = openFileDialog1.FileName; //取得檔名
                Encoding enc = Encoding.GetEncoding("big5"); //設定檔案的編碼
                string[] readText = System.IO.File.ReadAllLines(theFile, enc); //以指定的編碼方式讀取檔案
                foreach (string s in readText)
                {
                    string[] ss = s.Split(','); //將一列的資料,以逗號的方式進行資料切割,並將資料放入一個字串陣列
                    tbResult.Text += ss[0] + "  " + ss[1] + "  " + ss[2] + "  " + ss[3] + "  " + ss[4] + "\r\n";

                    //資料分別在取出的字串陣列裏,姓名->ss[0], 成績1->ss[1], 成績2->ss[2], 成績3->ss[3], 成績4->ss[4]
                }
            }

        }
    }
}

 

【一維字串陣列-字串物件】

 

 

底下的改版程式係將讀出來的資料,轉成浮點數後,放入一個2維的浮點數陣列,然後,將總分加總後,放到最後一個欄位(每列)。

       private void button2_Click(object sender, EventArgs e)
        {
            tbResult.Text = "";
            // 建立一個OpenFileDialog物件
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            // 設定OpenFileDialog屬性
            openFileDialog1.Title = "選擇要開啟的CSV檔案";
            openFileDialog1.Filter = "CSV Files (.csv)|*.csv|All Files (*.*)|*.*";
            openFileDialog1.FilterIndex = 1;

            openFileDialog1.Multiselect = true;

            // 喚用ShowDialog方法,打開對話方塊

            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string theFile = openFileDialog1.FileName; //取得檔名
                Encoding enc = Encoding.GetEncoding("big5"); //設定檔案的編碼
                string[] readText = System.IO.File.ReadAllLines(theFile, enc); //以指定的編碼方式讀取檔案

                string[] name = new string[readText.Length];//宣告一個1維字串陣列,來儲存所有的姓名
                double[][] allData = new double[readText.Length][4]; //宣告一個2維double陣列,用來儲存所有的成績資料,第一維的大小是資料的列數(筆數)
                int line = 0; //表第幾行(第幾列,每一列為一個學生的資料)
                foreach (string s in readText)
                {
                    string[] ss = s.Split(','); //將一列的資料,以逗號的方式進行資料切割,並將資料放入一個字串陣列
                    name[line] = ss[0]; //切出來的字串,第0個元素是姓名
                    allData[line][0] = double.Parse(ss[1]);
                    allData[line][1] = double.Parse(ss[2]);
                    allData[line][2] = double.Parse(ss[3]);
                    allData[line][3] = double.Parse(ss[4]);
                    allData[line][4] = allData[line][0] + allData[line][1] + allData[line][2]+ allData[line][3]; //將每個人的成績加起來放在最後一欄

                    tbResult.Text += name[line] + "  " + allData[line][0] + "  " + allData[line][1] + "  " + allData[line][2] + "  " + allData[line][3] + "  " + allData[line][4] + "\r\n";

                    line++; //進行下一筆資料的處理
                    //資料分別在取出的字串陣列裏,姓名->ss[0], 成績1->ss[1], 成績2->ss[2], 成績3->ss[3], 成績4->ss[4]
                }
            }

        }