用Visual C#實現檔案大批量處理

來源:互聯網
上載者:User
在科研、企業的資料處理中,有時會涉及大量的檔案操作。在大量資料處理的時侯,有時需要進行多對一,或一對多的檔案操作,即多個資料檔案與一個資料檔案進行資訊互動,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。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.