基于VB和PYTHON的问卷录入与分析系统
2018-01-06徐畅畅
徐畅畅
摘要:采用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.