APP下载

基于VB和PYTHON的问卷录入与分析系统

2018-01-06徐畅畅

电脑知识与技术 2017年35期
关键词:数据录入副本选项

徐畅畅

摘要:采用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.

猜你喜欢

数据录入副本选项
基于SPSS软件在市场调研中的数据录入方法
面向流媒体基于蚁群的副本选择算法①
基于SPSS软件在市场调研中的数据录入方法
跟踪导练(四)
阅读理解
跟踪导练(5)
单项填空精选练习100道
副本放置中的更新策略及算法*