【程式設計-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] } } }