标题 | 基于VB和PYTHON的问卷录入与分析系统 |
范文 | 徐畅畅 摘要:采用VB 6.0语言开发数据录入问卷、核对并修改问录入数据错误等功能,PYTHON 3.5语言进行数据统计并绘制相应统计学图表,Excel文档进行问卷数据的保存、辅助问卷录入,自主研发出“先行”问卷录入与分析系统。该系统可高效完成数据采集和管理工作,节约了纸质问卷录入时间;同时该软件易于实施,数据移植性好,后续输出的电子数据基本不存在乱码现象;软件后续数据进行科学管理和统计分析,功能更趋完善,便于社会调查最终顺利实施。 关键词:计算机;调查问卷;数据录入;数据管理;编程;软件;VB 6.0;PYTHON 3.5 中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)35-0109-05 1 背景 随着21世纪的到来,我们的社会逐步迈入大数据时代,数据的收集、分析是处理大数据的基础。目前数据收集常采用纸质调查问卷,但纸质调查问卷需要手工输入问卷数据,进而进行统计学处理。手工转换为电子版的调查问卷数据统计学处理工作量大,后期数据汇总工作繁琐。现有的问卷录入软件界面繁琐,使用时往往需要操作者具备一定的专业常识。以EPIDATA问卷录入系统为代表相关软件,在录入中文内容时容易出现乱码,并且数据的移植性差。 Excel是Windows平台下电子表格处理软件,能够进行各种数据的处理、统计分析和辅助决策操作。Excel文档拥有良好的数据保管能力,数据移植性好,广泛地应用于众多领域。Visual Basic 6.0(VB 6.0)语言拥有易于学习,界面设计容易,与Excel的结合效果好。PYTHON语言同样易于学习,其强大之处在于它有丰富和强大的类库,可以方便地处理各种需求。PYTHON的绘图库(matplotlib库),是一款功能强大的科学绘图库,修复中文显示问题后可以高效率的绘制各种统计学图表。综上所述,结合Excel、VB 6.0、PYTHON优秀之处,可以很好地解决目前问卷录入系统目前存在的问题。 2 研究内容 2.1 软件设计的思维导图 1) 数据录入模块 2) 数据格式判断模块:统计学处理前准备工作 2.2 “先行”(Forerun)问卷录入与分析系统设计理念 “先行”(Forerun)问卷录入与分析系统(简称先行系统)应该包括问卷录入、数据统一格式保存、数据备份和统计学处理等功能。数据录入工作重复性质较强,需要一定效率的工作,强调录入系统准确和简洁特质。数据统一格式保存需要一定的兼容性,文字不易发生改变。数据备份同样需要一定的格式,保存内容在不同机器上不易发生改变,对于编程语言较为容易操作的性质。统计学处理建立在一定的数据保存格式下才能进行,需要效率高、精确度高。针对以上的问题,我结合自身先前的编程经历,决定设计一套软件组成的系统,配合不同语言的优势进行问卷录入系统软件设计。 2.3 先行系统设计的过程与实际操作流程 VB 6.0语言具有简单、易于组合软件界面的特点,且VB与Excel之间的兼容性好,我又经常使用,因此我设计先行系统时首先着手从上述语言开始编写。我先结合Excel设计问卷,并将问卷按照特定形式放于Excel中,方便使用VB进行处理。 2.4 先行系统的录入模块(基于VB6.0) 1) 问卷录入的准备工作 在VB中调用了“Microsoft Excel 15.0 Object Library”,使VB可以实现对于Excel的打开、关闭、读取、写入功能。新建窗体FORM1,将其命名为 “问题与选项”,声明与Excel处理有关的内容。 以下为声明内容: Dim ExApp As New Excel.Application Dim ExBook As Excel.Workbook Dim ExWorksheet As Excel.Worksheet 2) 电子问卷模板形成 按下FORM1的按键,将Excel中的问题、选项提取至软件中。 以下代码实现软件的问题与选项提取: Dim aata(1000) As String …… Dim hata(1000) As String Set ExApp = CreateObject("Excel.Application") Set ExApp = New Excel.Application Set ExBook = ExApp.Workbooks.Open(Text1.Text) Set xlsheet = ExBook.Worksheets("sheet1") For i = 1 To Val(Form2.wt.Text) — 1 ‘確定问题的个数,再导入问题及选项内容 aata(i) = ExApp.Sheets("sheet1").Range("a" & i).Value …… hata(i) = ExApp.Sheets("sheet1").Range("h" & i).Value Next i ExApp.ActiveWorkbook.Save ExApp.Workbooks.Close ExApp.Quit For q = 0 To Val(Form2.wt.Text) - 2 List1.AddItem aata(q + 1) …… List8.AddItem hata(q + 1) Next q 3) 问卷录入 随后新建FORM2,将其命名为“录入区”,在其中新建按钮等。利用CHECK选择框进行问题的勾选,TEXT输入框进行录入选项,录入选项同时进行备份,配有防关闭功能,断点重录功能,激活“临时休息区”(详见“操作流程”:1.3、1.4)。 以下代码实现录入时选项的显示: If Check3.Caption = "" Then ‘查找空白项:check1c和heck2为非空白项,检查check3-8 Check3.Visible = False End If …… If Check7.Caption = "" Then Check7.Visible = False End If If Check1.Caption = "(" Then Text1.Visible = False Text4.Visible = True ‘打开手工填写窗口 Text4.SetFocus End If 以下代码实现选择问题选项: If Val(Text1.Text) = 1 And Len(Check1.Caption) > 0 Then ‘问卷中相应问题项,其Len(object.Caption)>0 Check1.Value = 1 End If …… If Val(Text1.Text) = 7 And Len(Check7.Caption) > 0 Then Check7.Value = 1 End If If Val(Text1.Text) = 8 And Len(Check1.Caption) > 0 Then ‘特殊情况窗口被激活 Check8.Value = 1 End If Text1.Text = "" 以下代码负责在录入时进行备份: If Text1.Visible = True Then ‘nb.text为问卷序号(1、2、3….),text2.text为问题号,no.caption为问卷编号(例:vx0001) …… Open "d:\副本 内容.txt" For Append As #1 Print #1, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & b ‘b为选项 Close #1 Open "d:\副本 数字.txt" For Append As #2 Print #2, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & c ‘c为机械码 Close #2 Open "d:\副本 内容" & no.Caption & ".txt" For Append As #3 Print #3, b Close #3 Open "d:\副本 数字" & no.Caption & ".txt" For Append As #4 Print #4, c Close #4 Text1.SetFocus End If If Text4.Visible = True And Len(Text4.Text) > 0 Then …… Open "d:\副本 内容.txt" For Append As #1 Print #1, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & Text4.Text ‘text4.text为特殊情况与文字问题录入的窗口 Close #1 Open "d:\副本 數字.txt" For Append As #2 Print #2, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & "无" Close #2 Open "d:\副本 内容" & no.Caption & ".txt" For Append As #3 Print #3, Text4.Text Close #3 Open "d:\副本 数字" & no.Caption & ".txt" For Append As #4 Print #4, "无" Close #4 4) 数据导出 新建FORM3,命名为“导出区”,保存同时进行备份(详见“操作流程”中1.6)。 以下代码实现临时缓存区内的所有内容进行备份: listnum = Form4.List4.ListCount Open "d:\副本 1号.txt" For Append As #1 Print #1, Now Close #1 Open "d:\副本 2号.txt" For Append As #2 Print #2, Now Close #2 For i = 1 To listnum Open "d:\副本 1号.txt" For Append As #3 Print #3, Form4.List3.List(i) ‘备份问题选项临时存放区 Close #3 Open "d:\副本 2号.txt" For Append As #4 Print #4, Form4.List4.List(i) ‘备份机械码临时存放区 Close #4 Next i 以下代码实现保存问题选项的功能(与机械码保存相同): Command4_Click ‘对临时缓存区内的所有内容进行备份 Label3.Caption = "" listnum = Form4.List3.ListCount Dim bata(80000) As String ‘储存所有问题的选项结果 Dim x(80000) As String ‘x、y分别储存Excel文档的保存坐标 Dim y(80000) As String ‘记录切分点 Dim z(80000) As Single If Text1.Text = "" Or Text2.Text = "" Then a = MsgBox("无效路径!", 256) Exit Sub End If For o = 0 To listnum bata(o + 1) = Form4.List3.List(o) Next o Set ExApp = CreateObject("Excel.Application") Set ExApp = New Excel.Application Set ExBook = ExApp.Workbooks.Open(Text1.Text) Set xlsheet = ExBook.Worksheets("sheet1") …… For la = 1 To listnum On Error Resume Next xlsheet.Cells(Val(y(la)), Val(x(la))).Value = Mid(bata(la), z(la) + 2) Next la Label3.Caption = "done" ExApp.ActiveWorkbook.Save ExApp.Workbooks.Close ExApp.Quit 5) 问卷数据录入内容的保存与修改 新建FORM4,命名为“临时收录区”,用于支持数据的保存、修改。 以下部分实现“删除直接改正法”的“删除”按钮: On Error Resume Next List1.RemoveItem (List1.ListIndex) List2.RemoveItem (List2.ListIndex) List3.RemoveItem (List3.ListIndex) List4.RemoveItem (List4.ListIndex) 以下部分实现“删除直接改正法”的“插入”按钮: Private Sub List3_Click() ‘问题选项临时存放区 Text3.Text = 3 List1.ListIndex = -1 List2.ListIndex = -1 List4.ListIndex = -1 End Sub Private Sub List4_Click() ‘机械码临时存放区 Text3.Text = 4 List1.ListIndex = -1 List2.ListIndex = -1 List3.ListIndex = -1 End Sub Private Sub Command4_Click() ‘添加修改內容(注意:第一个格子不能修改) a = InputBox("输入修改内容") If Len(a) = 0 Then Exit Sub End If If Text3.Text = "1" Then List1.AddItem a, List1.ListIndex + 1 End If If Text3.Text = "3" Then List3.AddItem a, List3.ListIndex + 1 End If If Text3.Text = "4" Then List4.AddItem a, List4.ListIndex + 1 End If End Sub Private Sub Command6_Click( ) ‘添加修改内容(注意:仅能修改第一个格子) a = InputBox("输入修改内容") If Len(a) = 0 Then Exit Sub End If If Text3.Text = "1" Then List1.AddItem a, 0 End If If Text3.Text = "3" Then List3.AddItem a, 0 End If If Text3.Text = "4" Then List4.AddItem a, 0 End If End Sub 6) 问卷录入的安全 新建FORM5,命名为“临时休息区”,用于录入人员在录入时的临时休息。临时休息区一但激活会关闭所有其他窗口,解除需要密码(详见“操作流程”中1.7)。 以下代码实现临时休息区: Private Sub Command1_Click() If Text1.Text = "abcdef" Then ‘密码为abcdef Form1.Visible = True Form2.Visible = True Form4.Visible = True Form5.Visible = False End If Text1.Text = "" End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) ‘拒绝常规关闭(与录入区防关闭的代码相同) Cancel = True End Sub 2.3 先行系统的判断、绘图模块(基于PYTHON) 先行系统的录入部分组装完成后,我想起新学的PYTHON语言拥有有高效的、优秀的matplotlib库绘图能力与良好的数据处理能力,采用PYTHON进行统计学处理能提高统计学处理的速度,同时降低代码编写时的错误发生率。 首先进行编写的是排除人工填写部分,人工填写部分的内容之间存在較大差异性,因此先行系统对这部分数据不自动进行统计学处理。判断后的结果,均以文本文档形式(后缀为“.txt”的文件,简称TXT)保存。 以下代码实现判断是否需要进行自动绘图: a=str(0) #不是为0 b=str(1) #是为1 q=open("1.txt",'r') for line in q: s=line t=s.split() if (t[0][0].__contains__("(")) == True: t1=open("2.txt",'a') t1.write(b+"\n") t1.close() if (t[0][0].__contains__("(")) == False: t2=open("2.txt",'a') t2.write(a+"\n") t2.close() q.close() 绘图部分以TXT为媒介,结合之前的判断内容与后续添加的内容进行科学绘图。 以下代码实现自动绘图: cnames = [ #绘图颜色(无黑色和不易辨别的颜色) '#F0F8FF', '#00FFFF', '#7FFFD4', ……] panduan=[] #判断是否需要自动绘图 cn=[] #所有问题的选项结果 que=[] #问卷的问题 choose=[] #问卷题目的选项 huancun1=[] #缓存区1 huancun2=[] #缓存区2 huancun3=[] #缓存区3 qunub=0 #问题数量 st1=open("2.txt",'r')#读取判断表 for line in st1: s=line t=s.split() panduan=panduan + t st1.close() t="" s="" st2=open("cn.txt",'r') #读取录入的中文 for line in st2: s=line t=s.split() if len(huancun1) huancun1=huancun1 + t if len(huancun1)==len(t): cn.append(huancun1) huancun1=[] st2.close() t="" s="" st4=open("que.txt",'r') #读取问题 for line in st4: s=line t=s.split() que=que+t qunub=int(qunub)+1 st4.close() t="" s="" st5=open("1.txt",'r') #读取问题的选项 for line in st5: s=line t=s.split() if len(huancun3) huancun3=huancun3 + t if len(huancun3)==len(t): choose.append(huancun3) huancun3=[] st5.close() del s,t,line,huancun1,huancun2,huancun3 import matplotlib.pyplot as plt import matplotlib as mpl from matplotlib.font_manager import FontProperties for i in range(qunub): savename=i+1 tit=str(i+1)+"."+que[i] cn1=cn[i] pan=panduan[i] labels=[] inside=[] if pan=="0": #pan为1或其他字符,则不需画图 …… for s4 in range(len(labels)): #对选项进行折叠,防止问题过长超出画布 labels[s4]=labels[s4]+'('+inside[s4]+'人)' if len(labels[s4])>15: zz=len(labels[s4]) for n in range (10,zz+1,10): labels[s4]=labels[s4][:n]+'\n'+labels[s4][n:] …… pie=plt.pie(inside,labels=labels,autopct='%1.2f%%',colors=cnames) #設置为绘制饼图,显示百分比 …… a.set_size_inches(18.5, 10.5) #设置画布大小 a.savefig('图表/'+str(savename)+'.png',dpi=90) a.show() 以上海市xxx小学的数据为例,成功的导出了录入数据与统计学图表,软件的测试获得了成功(详见“操作流程”、“图表”文件夹)。 3 结束语 本软件界面操作简洁,无需太多计算机方面的知识即可掌握操作方法。 软件运行快捷,有效的提高了问卷录入的速度;基层使用者大多数熟悉Excel的基本操作,对于数据的管理提供了便利,也减低了数据管理对使用者的难度。充分利用了VB的界面设计、PYTHON的绘图能力与Excel的数据移植性方面的优势,与现有的许多的问卷录入软件不支持中文相比,本软件几乎完美 地支持中文。有关闭密码,无法通过常规方法关闭,提高了录入的安全性。因此,该软件的适用范围较为广泛,有较大的使用前景和推广价值。 总之,通过先行系统进行数据录入及统计学处理,可高效完成数据采集和管理工作,大大节约了纸质问卷录入时间与确保录入时的安全,软件后续数据进行科学管理和统计分析,便于社会调查最终顺利实施。 参考文献: [1] 范荫恒.《物理化学实验》数据处理系统软件的开发及应用[J]. 计算机与应用化学, 2005(11):1066-1069. [2] 孔玉. 临床试验数据管理软件的开发与应用[J]. 第二军医大学, 2007(63). [3] 庞胜利. Python环境下用pyExcelerator操作Excel[J]. 电脑编程技巧与维护, 2009(20):48-49,64. [4] 魏绍蓉. 基于Visual Basic与Excel相结合的问题研究[J]. 青海师范大学学报:自然科学版, 2010(1):67-69. [5] 罗隆福. 基于VB的电力机车牵引变压器分析软件开发[J]. 湖南大学学报:自然科学版, 2011(7):43-47. [6] 陆健. 临床试验电子化数据管理与统计分析系统的开发及应用[D].上海: 第二军医大学, 2012. [7] 孙玉环. 基于EpiData与SAS系统的纸版问卷数据录入质量控制技巧[J]. 中国卫生统计, 2012(4):607-608,611. [8] 李潇. 基于excel的数据管理及其在公共卫生领域内的应用[J]. 中国卫生统计, 2014(6):1084-1086. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。