徐 沁,李清妍,楊詩捷, 談加穎
(上海海洋大學(xué)信息學(xué)院, 上海 201306)
?
C#與SAS混合編程
——以學(xué)生成績評估可視化開發(fā)中的應(yīng)用為例
徐 沁,李清妍,楊詩捷, 談加穎
(上海海洋大學(xué)信息學(xué)院, 上海 201306)
探討了Visual C#和SAS基于調(diào)用.bat文件的混合編程方法,通過編寫.bat文件、Visual C#調(diào)用.bat文件和Visual C#調(diào)用EXCEL等文件這3個(gè)步驟,形成了一種便利的編程方法,可以解決使用跨平臺軟件混合編程的問題。并且,將該方法在學(xué)生成績評估可視化開發(fā)中加以了應(yīng)用,較好地驗(yàn)證了C#與SAS混合編程的有效性和便利性。
Visual; C#; SAS; 混合編程; .bat文件
現(xiàn)今處于大數(shù)據(jù)時(shí)代,人們對于數(shù)據(jù)的處理已從淺顯地統(tǒng)計(jì)分析躍升到挖掘其深層,試圖通過分析進(jìn)行評估、預(yù)測演算、甚至是模擬實(shí)現(xiàn)。通過強(qiáng)大的數(shù)據(jù)統(tǒng)計(jì)軟件SAS可以精準(zhǔn)地對數(shù)據(jù)進(jìn)行分析計(jì)算。同時(shí),可視化的界面開發(fā)則能以最淺顯的方式將數(shù)據(jù)處理和計(jì)算的結(jié)果以直觀、簡潔的方式展現(xiàn)在用戶面前。因此,在進(jìn)行可視化開發(fā)的同時(shí)結(jié)合強(qiáng)大的專業(yè)統(tǒng)計(jì)分析軟件混合編程也是當(dāng)下的主流之一。由于這兩者的專業(yè)性不同,使得許多研究者在混合編程的過程中困難重重。
因此,將兩者混合編程也是當(dāng)今主流軟件等較多使用的方法。基于.net的交互式編程是很多混合編程的首選。但由于個(gè)人版本的SAS基本上沒有為用戶提供.net接口(沒有SAS/IT板塊),尤其是個(gè)人研究者進(jìn)行可視化開發(fā)研究常常因此而困難重重。因此提出了通過C#調(diào)用.bat批處理的方法來實(shí)現(xiàn)C#和SAS的混合編程,這種方法可以非常簡單的實(shí)現(xiàn)兩者的混合編程。
2.1Visual C#、SAS和.bat文件簡介
(1)C#是微軟開發(fā)的一種面向?qū)ο蟮?、運(yùn)行于.NET Framework之上的高級程序設(shè)計(jì)語言;而Micrsoft Visual C#是微軟開發(fā)的C#編程集成環(huán)境。
(2)SAS是專業(yè)而強(qiáng)大的統(tǒng)計(jì)分析軟件。它是一個(gè)組合軟件系統(tǒng),它由多個(gè)功能模塊組合而成。用戶可以通過編程使用SAS的不同模塊來完成不同的統(tǒng)計(jì)分析計(jì)算、繪圖、數(shù)據(jù)庫鏈接以及宏開發(fā)等。
(3).bat文件是windows下的批處理文件,為可執(zhí)行文件??梢允褂肈OS下的Edit或者Windows的記事本等文本文件編輯工具創(chuàng)建和修改。使用.bat文件可以自動(dòng)運(yùn)行指定的程序。
2.2bat文件調(diào)用SAS程序的實(shí)現(xiàn)
非企業(yè)版的SAS一般不為用戶提供.NET接口,因此要使其與C#進(jìn)行交互式連接需要通過SAS的宏編程來實(shí)現(xiàn)。這樣不僅編程難度高而且非常麻煩。因此,通過.bat的批處理文件的使用可以簡單的實(shí)現(xiàn)SAS與C#的混合編程。 .bat文件可以通過編輯和修改文本文件實(shí)現(xiàn),在文本文件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 表示在此語句后所有運(yùn)行的命令都不顯示命令行本身,而@是加在每個(gè)命令行的最前面,表示運(yùn)行時(shí)不顯示這一行的命令行,只能影響當(dāng)前行。@echo on和@echo off是.bat文件的一般開頭和結(jié)尾的形式。在這中間的代碼便是要執(zhí)行的自動(dòng)調(diào)用命令。"D:SAS92SASFoundation9.2sas.exe"是執(zhí)行打開在此路徑下sas.exe的命令; 而-sysin C:Users Desktopcx1.sas則表示運(yùn)行此路徑下的已經(jīng)編寫完成的SAS程序。
編寫好代碼之后只要將文本文檔的后綴.txt改為.bat,就完成了.bat文件的編寫。由于.bat是可執(zhí)行文件,雙擊之后便能實(shí)現(xiàn)自動(dòng)運(yùn)行SAS的程序。同時(shí),一個(gè).bat文件可以有多條DOS的命令,即可以一次調(diào)用多個(gè)SAS程序;上述的編碼就同時(shí)調(diào)用了兩個(gè)SAS程序。
2.3C#調(diào)用.bat文件
C#是專門為.NET的應(yīng)用而開發(fā)的語言,因此在C#中啟動(dòng)外殼程序可以通過使用.NET 框架的Process類來簡單的完成。C#的可視化界面開發(fā)非常便利,基本只要對添加的控件編程即可;總體框架的編程是由Visual Studio自動(dòng)完成編程的。 Process類在System.Diagnostics的命名空間下,因此要使用此類進(jìn)行編程首先要在引用命名空間:using System.Diagnostics。在編程過程中首先使用ProcessStartInfo創(chuàng)建新的實(shí)例、設(shè)置參數(shù),然后對實(shí)例調(diào)用start;通過這種方法來調(diào)用.bat文件。
在此有兩種編程的方法,一種是在控件之下編程,這種方法打開窗體時(shí)是不會(huì)自動(dòng)調(diào)用.bat的,只有在點(diǎn)擊控件的情況下才會(huì)調(diào)用.bat。另一種方法便是在窗體下編程;這種方法在打開窗體時(shí)會(huì)自動(dòng)調(diào)用.bat,并不需要控件來觸發(fā)。其調(diào)用.bat文件的主要代碼如下:
private void button1_Click / Form1_Load (object sender,EventArgs e)
{
ProcessStartInfo ps=new ProcessStartInfo("C: \Users\AnotherJ\Desktop\項(xiàng)目\bichuli2.bat");//實(shí)例一個(gè)對象,給他目標(biāo)文件的地址。
ps.WindowStyle=ProcessWindowStyle.Hidden;//隱藏sas代碼運(yùn)行的界面。
Process p1=Process.Start(ps);//運(yùn)行之前的實(shí)例。
}
其中private void button1_Click是第一種調(diào)用方法,即點(diǎn)擊button1按鈕之后執(zhí)行下面程序;而private void Form1_Load則是第二種調(diào)用方法,編寫在窗體代碼之下,打開窗體后自動(dòng)執(zhí)行下面程序。
通過Process類可以完成對.bat文件的調(diào)用,同時(shí)也可以隱藏外殼程序的運(yùn)行過程,使界面比較美觀。
2.4C#調(diào)用.bat文件生成的EXCEL等文件
在使用SAS處理數(shù)據(jù)過程中,一般會(huì)將數(shù)據(jù)處理的結(jié)果會(huì)以各種格式(如EXCEL、PDF等)輸出。而使用 SAS與C#的混合編程就是要實(shí)現(xiàn)將SAS數(shù)據(jù)處理的結(jié)果以直觀、簡介的方式顯示在C#的可視化界面中。如下方法可以實(shí)現(xiàn)SAS程序處理結(jié)果的可視化可發(fā)。
對于一般的數(shù)據(jù)處理和作圖,EXCEL是 SAS輸出最多的文件格式之一。在C#中調(diào)用EXCEL文件有多種方法:可以采用OleDB讀取EXCEL文件;可以引用的COM組件;也可以用文件流讀取。此處主要介紹使用COM組件的方法來實(shí)現(xiàn)EXCEL的調(diào)用。
使用COM組件可以可以非常靈活的讀取Excel中的數(shù)據(jù),方便進(jìn)行復(fù)雜操作。在編程之前首先要將Excel的COM組件轉(zhuǎn)換為.NET組件:在項(xiàng)目中打開Add Reference對話框,選擇COM欄,之后在COM列表中找到“Microsoft Excel 9.0 Object Library”(Office 2000),然后將其加入到項(xiàng)目的References中即可;Visual C#.NET會(huì)自動(dòng)產(chǎn)生相應(yīng)的.NET組件文件。然后引用命名空間:using Excel = Microsoft.Office.Interop.Excel。其讀取主要代碼如下:
private void button1_Click(object sender, EventArgs e)
{ string[,] a = new string[44, 56];//建立數(shù)組,用于存儲(chǔ)excel數(shù)據(jù)。
EXCEL.Application app = new EXCEL.Application();//使用Excel.Application組件來訪問Excel
OpenFileDialog dlg = new OpenFileDialog();//實(shí)例化對象,獲取用戶選擇文件的所在目錄和文件名稱
if (dlg.ShowDialog() == DialogResult.OK)//對象選擇成功
{try
{ EXCEL.WorkbookxlsWorkBook=app.Workbooks.Open(dlg.FileName,Type.Missing,Type.Missing);//表示 Type 信息中的缺少值。使用 Missing 字段通過反射進(jìn)行調(diào)用,以獲取參數(shù)的默認(rèn)值。
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)的值存入數(shù)組,循環(huán)存入。}
}
}
}
}
通過這種方法讀取EXCEL文件可以進(jìn)行查詢等復(fù)雜操作并顯示在datagridview中。
3.1SAS與C#的混合編程
編程環(huán)境:SAS 9.2 Visual Studio2013 SQL。
筆者通過使用SAS軟件分析某一門課程多年情況和作圖,并通過C#可視化界面顯示其分析的結(jié)果來實(shí)現(xiàn)上文所述的SAS與C#混合編程。
第一步:使用SAS對原始數(shù)據(jù)表格進(jìn)行編程處理,處理結(jié)果將成為PDF格式文件導(dǎo)出到指定路徑。 第二步: 使用記事本編寫.bat程序并存為.bat文件,文件名為cx.bat。 第三步:使用C#創(chuàng)建可視化窗口,在窗體代碼下使用的Process類編程,自動(dòng)運(yùn)行此.bat文件。 第四步:在窗體中的按鈕控件代碼下調(diào)用.bat運(yùn)行后生成的SAS處理結(jié)果:查詢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運(yùn)行結(jié)果
編譯有運(yùn)行后會(huì)出現(xiàn)可視化窗體,在學(xué)號中輸入學(xué)號,并點(diǎn)擊“查詢”按鈕,將在dataGridView中顯示此同學(xué)的成績情況如圖1所示;在課程中輸入課程名,點(diǎn)擊“查詢”按鈕,將顯示此課程的箱線圖(即pdf文件)如圖2所示。
圖1學(xué)生成績情況
圖2 箱線圖PDF顯示
經(jīng)過探討Visual C#和SAS混合編程的具體方法和步驟,并將該方法在研究中加以應(yīng)用。通過調(diào)用.bat文件解決了個(gè)人可視化開發(fā)研究中非企業(yè)版的SAS和C#無法通過.NET接口連接的問題。利用SAS強(qiáng)大的統(tǒng)計(jì)分析功能,Visual C#調(diào)用SAS能夠更便捷的實(shí)現(xiàn)統(tǒng)計(jì)分析的可視化開發(fā)。可滿足一般研究者的開發(fā)要求。
[1]劉克成, 張凌曉. C#程序設(shè)計(jì)[M]. 北京: 中國鐵道出版社,2011.
[2]胡良平, 胡純嚴(yán). SAS語言基礎(chǔ)與高級編程技術(shù)[M]. 北京: 電子工業(yè)出版社,2014.
[3]Christian N, Jay G, Morgan S. C#高級編程:C# 5.0 & .NET 4.5.1[M].9版.北京: 清華大學(xué)出版社,2014.
[4]軟件開發(fā)技術(shù)聯(lián)盟. C#開發(fā)實(shí)戰(zhàn)[M]. 北京: 清華大學(xué)出版社,2013.
[5]蔡昭權(quán). 數(shù)據(jù)挖掘中SAS和.NET系統(tǒng)的集成[J]. 計(jì)算機(jī)工程與設(shè)計(jì), 2007(22): 5356~5358.
[6]胡雙,陸濤,胡建華. 基于Web服務(wù)的SAS與.NET系統(tǒng)集成開發(fā)研究[J]. 計(jì)算機(jī)與現(xiàn)代化, 2014(4): 126~129.
2016-06-27
上海海洋大學(xué)校級聯(lián)合大作業(yè)項(xiàng)目(編號:2015012)
徐沁(1995—),女,上海海洋大學(xué)信息學(xué)院學(xué)生。
鄭奕(1963—),男,教授,主要從事數(shù)理經(jīng)濟(jì)和統(tǒng)計(jì)學(xué)方向的教學(xué)與科研工作。
TP313
A
1674-9944(2016)16-0251-04