在科研、企業的資料處理中,有時會涉及大量的檔案操作。在大量資料處理的時侯,有時需要進行多對一,或一對多的檔案操作,即多個資料檔案與一個資料檔案進行資訊互動,Microsoft的.NET開發利器C#提供了前所未有的高開發效率,在檔案操作方面也有所體現。筆者基於.NET平台,以C#開發工具,實現了如下功能:
1、多個文字檔合并成一個檔案;
2、一個試算表檔案分成多個檔案。
一、編程任務描述:
1、從多個檔案中讀取資料產生一個文字檔
筆者是處理測井資料的時侯碰到這種編程需求,現有測井資料若干,每口井一個檔案,為進一步處理現需要,將這些資料讀到一新檔案中去,在實際處理,當然包括一定的計算與篩選及格式化。
多個源檔案在源檔案路徑下,最終產生的目標檔案存在在目標檔案路徑下。
例子資料在sourcefile 檔案夾下:1.bln,2.bln,3.bln,4,bln,5,bln,6.bln共六個檔案,它們合并後產生的total.txt檔案在aimfile子檔案夾下。
2、從一個檔案中讀資料,產生多個文字檔
例子源檔案是:xcsj.xls存放在aimfile檔案夾下,其資料內容是:
| 井名 |
層位 |
細分小層號 |
層頂深度 |
層厚 |
| 13-10 |
S3中4 |
1 |
3263.5 |
1.5 |
| 13-10 |
S3中5 |
2 |
3311.6 |
1.6 |
| … … … |
|
|
|
|
其中多口井的資料在一個表格中,實際工作中需要將其中每口井的資料選出來產生一個獨立的檔案,檔案尾碼為.xc,存在目標檔案路徑下,組建檔案的格式為:
| 井名 |
層位 |
細分小層號 |
層頂深度 |
層厚 |
| 13-10 |
S3中4 |
1 |
3263.5 |
1.5 |
| 13-10 |
S3中5 |
2 |
3311.6 |
1.6 |
| … … … |
|
|
|
|
產生的的目標檔案13-10.xc等也存放在aimfile檔案夾下。
二、程式介面
產生一個表單,表單上主要添加如下控制項:
1、三個按扭:一是合并檔案; 一是檔案拆分; 一是退出;
2、一個列表框 用來顯示程式執行情況
3、兩個文字框,分別用來輸入源檔案路徑與目標檔案路徑;
4、一個進度條,用來指示,程式的執行進度;
程式介面如下:
三、來源程式主要代碼:
1、名字空間
using System;using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; //使用StreamWriter與StreamReader必須加的Namespaceusing System.Data.OleDb; using System.Data.SqlClient; //讀試算表檔案必須加的Namespace |
2、檔案合并按鈕回應程式法
string winDir1; //源檔案路徑 string winDir2; //目標檔案路徑 string temp1; int ii; winDir1=textBox1.Text.Trim(); winDir2=textBox2.Text.Trim()+"\\total.txt"; //擷取winDir1路徑下所有檔案清單 string[] dirs = Directory.GetFiles(winDir1); //建立或開啟目標檔案 StreamWriter writer = new StreamWriter(winDir2); writer.WriteLine("這是匯總檔案頭"); writer.WriteLine("這是匯總檔案第二行"); ii=0; foreach(string dir in dirs) { StreamReader reader=new StreamReader(dir); try { reader.ReadLine(); do { temp1=reader.ReadLine(); temp1=temp1.Trim(); writer.WriteLine(temp1); } while(reader.Peek() != -1); ii=ii+1; } catch( Exception err) { MessageBox.Show(err.Message); } finally { reader.Close(); } } addListItem("合併作業結束"); addListItem("本次操作共有"+ii.ToString()+"個檔案合并到檔案total.txt中去"); addListItem("total.txt檔案存放位置為"+textBox2.Text); writer.Close(); |
3、檔案分割按鈕回應程式法
//定義變數 string winDir; //檔案路徑 string filename; //結果檔案名 string [] filename2=new string[300]; //儲存產生的檔案名稱 string temp1,temp2,temp3,temp4; string strCon; //串連串 int ii; //統計產生的結果檔案數 ii=1; winDir=textBox2.Text.Trim()+@"\xcsj.xls;"; //建立一個資料連結 strCon= " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source ="+winDir+"Extended Properties=Excel 8.0" ; OleDbConnection myConn = new OleDbConnection ( strCon ) ; string strCom = " SELECT * FROM [Sheet1$] " ; myConn.Open ( ) ; //開啟資料連結,得到一個資料集 OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; //建立一個 DataSet對象 DataSet myDataSet = new DataSet ( ) ; //得到自己的DataSet對象 myDataSet try { myCommand.Fill ( myDataSet , "[Sheet1$]" ) ; } catch( Exception err) { MessageBox.Show(err.Message); } //根據試算表中第一列的井號讀出井名到數組中去 temp1=myDataSet.Tables[0].Rows[0][0].ToString().Trim(); filename2[ii]=temp1; foreach ( DataRow row in myDataSet.Tables[0].Rows ) { if (temp1!=row[0].ToString().Trim() ) { ii=ii+1; filename2[ii]=row[0].ToString(); temp1=row[0].ToString().Trim(); } } //進度條初始化 progressBar1.Step=1; progressBar1.Minimum=1; progressBar1.Maximum=ii; winDir=textBox2.Text.Trim(); for(int k=1;k<=ii;k++) { filename=@winDir+"\\"+filename2[k].Trim()+".xc"; StreamWriter writer = new StreamWriter(filename); writer.WriteLine("層位 細分小層號 層頂深度 層厚"); foreach( DataRow row in myDataSet.Tables[0].Rows ) { temp1=row[1].ToString().Trim(); temp2=row[2].ToString().Trim(); temp3=row[3].ToString().Trim(); temp4=row[4].ToString().Trim(); writer.WriteLine(temp1+" "+temp2+" "+temp3+" "+temp4); } writer.Close(); progressBar1.PerformStep(); } myConn.Close(); addListItem("操作結果"); addListItem("共產生"+ii.ToString()+"檔案"); addListItem(@"檔案位置:F:\wangwei\work\h12\xc路徑下"); listBox1.Refresh(); |
4、為顯示執行結果添加了一上列表框,為方便巨集指令清單框需要為表單類添加一個方法:
private void addListItem(string value) { this.listBox1.Items.Add(value); } |
五、要點分析
1、用StreamWriter與StreamReader類進行檔案存取操作
這是一對從 Stream 派生的類,用於位元組的輸入和輸出。其名字空間為 system.io
2、讀取電子錶資料
本程式提供了一種串連電子錶檔案的方法,必要的名字空間要加好,注意串連串不要寫錯。
3、Directory類的GetFiles 方法應用
可以程式自動的讀出檔案清單到到一個標準數組中去,以備進一步使用,選取檔案的方法有多種,這種方法體現了C#的高效性,值得向大家推薦。
說明:本文附來源程式,在啟動並執行時侯注意輸入正確的檔案路徑。若你機器裡面沒裝.net,也可以直接運行已經編譯好的執行檔案。在\bin\debug子檔案夾下面的Csdata.exe。