徐 沁,李清妍,楊詩捷, 談加穎
(上海海洋大學信息學院, 上海 201306)
?
C#與SAS混合編程
——以學生成績評估可視化開發中的應用為例
徐 沁,李清妍,楊詩捷, 談加穎
(上海海洋大學信息學院, 上海 201306)
探討了Visual C#和SAS基于調用.bat文件的混合編程方法,通過編寫.bat文件、Visual C#調用.bat文件和Visual C#調用EXCEL等文件這3個步驟,形成了一種便利的編程方法,可以解決使用跨平臺軟件混合編程的問題。并且,將該方法在學生成績評估可視化開發中加以了應用,較好地驗證了C#與SAS混合編程的有效性和便利性。
Visual; C#; SAS; 混合編程; .bat文件
現今處于大數據時代,人們對于數據的處理已從淺顯地統計分析躍升到挖掘其深層,試圖通過分析進行評估、預測演算、甚至是模擬實現。通過強大的數據統計軟件SAS可以精準地對數據進行分析計算。同時,可視化的界面開發則能以最淺顯的方式將數據處理和計算的結果以直觀、簡潔的方式展現在用戶面前。因此,在進行可視化開發的同時結合強大的專業統計分析軟件混合編程也是當下的主流之一。由于這兩者的專業性不同,使得許多研究者在混合編程的過程中困難重重。
因此,將兩者混合編程也是當今主流軟件等較多使用的方法。基于.net的交互式編程是很多混合編程的首選。但由于個人版本的SAS基本上沒有為用戶提供.net接口(沒有SAS/IT板塊),尤其是個人研究者進行可視化開發研究常常因此而困難重重。因此提出了通過C#調用.bat批處理的方法來實現C#和SAS的混合編程,這種方法可以非常簡單的實現兩者的混合編程。
2.1Visual C#、SAS和.bat文件簡介
(1)C#是微軟開發的一種面向對象的、運行于.NET Framework之上的高級程序設計語言;而Micrsoft Visual C#是微軟開發的C#編程集成環境。
(2)SAS是專業而強大的統計分析軟件。它是一個組合軟件系統,它由多個功能模塊組合而成。用戶可以通過編程使用SAS的不同模塊來完成不同的統計分析計算、繪圖、數據庫鏈接以及宏開發等。
(3).bat文件是windows下的批處理文件,為可執行文件。可以使用DOS下的Edit或者Windows的記事本等文本文件編輯工具創建和修改。使用.bat文件可以自動運行指定的程序。
2.2bat文件調用SAS程序的實現
非企業版的SAS一般不為用戶提供.NET接口,因此要使其與C#進行交互式連接需要通過SAS的宏編程來實現。這樣不僅編程難度高而且非常麻煩。因此,通過.bat的批處理文件的使用可以簡單的實現SAS與C#的混合編程。 .bat文件可以通過編輯和修改文本文件實現,在文本文件txt中輸入如下代碼:
@echo on
"D:SAS92SASFoundation9.2sas.exe" -sysin C:Users Desktopcx1.sas
"D:SAS92SASFoundation9.2sas.exe" -sysin C:Users Desktopcx2.sas
@echo off
然后將其保存為后綴是.bat的文件,這樣.bat文件就編寫完成了。 在.bat程序中echo on表示顯示此命令后的字符,echo off 表示在此語句后所有運行的命令都不顯示命令行本身,而@是加在每個命令行的最前面,表示運行時不顯示這一行的命令行,只能影響當前行。@echo on和@echo off是.bat文件的一般開頭和結尾的形式。在這中間的代碼便是要執行的自動調用命令。"D:SAS92SASFoundation9.2sas.exe"是執行打開在此路徑下sas.exe的命令; 而-sysin C:Users Desktopcx1.sas則表示運行此路徑下的已經編寫完成的SAS程序。
編寫好代碼之后只要將文本文檔的后綴.txt改為.bat,就完成了.bat文件的編寫。由于.bat是可執行文件,雙擊之后便能實現自動運行SAS的程序。同時,一個.bat文件可以有多條DOS的命令,即可以一次調用多個SAS程序;上述的編碼就同時調用了兩個SAS程序。
2.3C#調用.bat文件
C#是專門為.NET的應用而開發的語言,因此在C#中啟動外殼程序可以通過使用.NET 框架的Process類來簡單的完成。C#的可視化界面開發非常便利,基本只要對添加的控件編程即可;總體框架的編程是由Visual Studio自動完成編程的。 Process類在System.Diagnostics的命名空間下,因此要使用此類進行編程首先要在引用命名空間:using System.Diagnostics。在編程過程中首先使用ProcessStartInfo創建新的實例、設置參數,然后對實例調用start;通過這種方法來調用.bat文件。
在此有兩種編程的方法,一種是在控件之下編程,這種方法打開窗體時是不會自動調用.bat的,只有在點擊控件的情況下才會調用.bat。另一種方法便是在窗體下編程;這種方法在打開窗體時會自動調用.bat,并不需要控件來觸發。其調用.bat文件的主要代碼如下:
private void button1_Click / Form1_Load (object sender,EventArgs e)
{
ProcessStartInfo ps=new ProcessStartInfo("C: \Users\AnotherJ\Desktop\項目\bichuli2.bat");//實例一個對象,給他目標文件的地址。
ps.WindowStyle=ProcessWindowStyle.Hidden;//隱藏sas代碼運行的界面。
Process p1=Process.Start(ps);//運行之前的實例。
}
其中private void button1_Click是第一種調用方法,即點擊button1按鈕之后執行下面程序;而private void Form1_Load則是第二種調用方法,編寫在窗體代碼之下,打開窗體后自動執行下面程序。
通過Process類可以完成對.bat文件的調用,同時也可以隱藏外殼程序的運行過程,使界面比較美觀。
2.4C#調用.bat文件生成的EXCEL等文件
在使用SAS處理數據過程中,一般會將數據處理的結果會以各種格式(如EXCEL、PDF等)輸出。而使用 SAS與C#的混合編程就是要實現將SAS數據處理的結果以直觀、簡介的方式顯示在C#的可視化界面中。如下方法可以實現SAS程序處理結果的可視化可發。
對于一般的數據處理和作圖,EXCEL是 SAS輸出最多的文件格式之一。在C#中調用EXCEL文件有多種方法:可以采用OleDB讀取EXCEL文件;可以引用的COM組件;也可以用文件流讀取。此處主要介紹使用COM組件的方法來實現EXCEL的調用。
使用COM組件可以可以非常靈活的讀取Excel中的數據,方便進行復雜操作。在編程之前首先要將Excel的COM組件轉換為.NET組件:在項目中打開Add Reference對話框,選擇COM欄,之后在COM列表中找到“Microsoft Excel 9.0 Object Library”(Office 2000),然后將其加入到項目的References中即可;Visual C#.NET會自動產生相應的.NET組件文件。然后引用命名空間:using Excel = Microsoft.Office.Interop.Excel。其讀取主要代碼如下:
private void button1_Click(object sender, EventArgs e)
{ string[,] a = new string[44, 56];//建立數組,用于存儲excel數據。
EXCEL.Application app = new EXCEL.Application();//使用Excel.Application組件來訪問Excel
OpenFileDialog dlg = new OpenFileDialog();//實例化對象,獲取用戶選擇文件的所在目錄和文件名稱
if (dlg.ShowDialog() == DialogResult.OK)//對象選擇成功
{try
{ EXCEL.WorkbookxlsWorkBook=app.Workbooks.Open(dlg.FileName,Type.Missing,Type.Missing);//表示 Type 信息中的缺少值。使用 Missing 字段通過反射進行調用,以獲取參數的默認值。
EXCEL.Worksheet xlsWorkSheet = (EXCEL.Worksheet)xlsWorkBook.Sheets["Sheet1"];//解析excel的名為“Sheet1”的表格。
for (int i = 1; i < 45; i++)
{ for (int j = 1; j < 57; j++)
{ EXCEL.Range c1 = (EXCEL.Range)xlsWorkSheet.Cells[i, j];//left行,right列
EXCEL.Range xlsRang = (EXCEL.Range)xlsWorkSheet.get_Range(c1, c1);//獲取excel中(c1,c1)的值
a[i - 1, j - 1] = xlsRang.Text.ToString().Trim();//將excel中(c1,c1)的值存入數組,循環存入。}
}
}
}
}
通過這種方法讀取EXCEL文件可以進行查詢等復雜操作并顯示在datagridview中。
3.1SAS與C#的混合編程
編程環境:SAS 9.2 Visual Studio2013 SQL。
筆者通過使用SAS軟件分析某一門課程多年情況和作圖,并通過C#可視化界面顯示其分析的結果來實現上文所述的SAS與C#混合編程。
第一步:使用SAS對原始數據表格進行編程處理,處理結果將成為PDF格式文件導出到指定路徑。 第二步: 使用記事本編寫.bat程序并存為.bat文件,文件名為cx.bat。 第三步:使用C#創建可視化窗口,在窗體代碼下使用的Process類編程,自動運行此.bat文件。 第四步:在窗體中的按鈕控件代碼下調用.bat運行后生成的SAS處理結果:查詢EXCEL并顯示成績和顯示pdf文件。其主要代碼如下:
private void asses_Load (object sender,EventArgs e)
{
ProcessStartInfo a=new ProcessStartInfo("C:\Users\AnotherJ\Desktop\ cx.bat");
a.WindowStyle=ProcessWindowStyle.Hidden;
Process p1=Process.Start(a);
}
private void button2_Click(object sender, EventArgs e)
{
DataClasses1DataContext db = new DataClasses1DataContext();
var results = from r in db.qianyue
where r._3 == this.textBox1.Text || r.id == 201
select r;
if (results != null)
{ foreach (qianyue r in results)
{ this.label3.Text = r._39+"%";
}
}
this.dataGridView1.DataSource = results;
dataGridView1.Refresh();
}
private void button1_Click(object sender, EventArgs e)
{
Process.Start("C:\Users\AnotherJ\Desktop\a\sasprt.pdf");
}
3.2運行結果
編譯有運行后會出現可視化窗體,在學號中輸入學號,并點擊“查詢”按鈕,將在dataGridView中顯示此同學的成績情況如圖1所示;在課程中輸入課程名,點擊“查詢”按鈕,將顯示此課程的箱線圖(即pdf文件)如圖2所示。

圖1學生成績情況

圖2 箱線圖PDF顯示
經過探討Visual C#和SAS混合編程的具體方法和步驟,并將該方法在研究中加以應用。通過調用.bat文件解決了個人可視化開發研究中非企業版的SAS和C#無法通過.NET接口連接的問題。利用SAS強大的統計分析功能,Visual C#調用SAS能夠更便捷的實現統計分析的可視化開發。可滿足一般研究者的開發要求。
[1]劉克成, 張凌曉. C#程序設計[M]. 北京: 中國鐵道出版社,2011.
[2]胡良平, 胡純嚴. SAS語言基礎與高級編程技術[M]. 北京: 電子工業出版社,2014.
[3]Christian N, Jay G, Morgan S. C#高級編程:C# 5.0 & .NET 4.5.1[M].9版.北京: 清華大學出版社,2014.
[4]軟件開發技術聯盟. C#開發實戰[M]. 北京: 清華大學出版社,2013.
[5]蔡昭權. 數據挖掘中SAS和.NET系統的集成[J]. 計算機工程與設計, 2007(22): 5356~5358.
[6]胡雙,陸濤,胡建華. 基于Web服務的SAS與.NET系統集成開發研究[J]. 計算機與現代化, 2014(4): 126~129.
2016-06-27
上海海洋大學校級聯合大作業項目(編號:2015012)
徐沁(1995—),女,上海海洋大學信息學院學生。
鄭奕(1963—),男,教授,主要從事數理經濟和統計學方向的教學與科研工作。
TP313
A
1674-9944(2016)16-0251-04