在科研、企業的數據處理中,有時會涉及大量的文件操作。在大量數據處理的時侯,有時需要進行多對一,或一對多的文件操作,即多個數據文件與一個數據文件進行信息交互,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
[1] [2] 下一頁
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。
下載源文件
上一頁 [1] [2]