1. QUANTUM介绍 1.1. QUANTUM主要功能 1.2. QUANTUM运行过程 1.2.1. 编译Quantum程序 1.2.2. 装入C编码 1.2.3. 读入数据 1.2.4. 产生表格 1.3. QUANTUM处理数据步骤 2. QUANTUM安装
2.1. 运行QUANTUM最低要求 2.2. QUANTUM目录结构 2.3. QUANTUM安装步骤 3. 数据 3.1. 基本元素 3.1.1. 数据常量 3.1.2. 数字 3.1.3. 变量和数组 3.2. QUANTUM数据格式 3.3. 数据结构 4. 轴(AXES) 4.1. 轴定义 4.1.1. 特殊条件 4.2. COL语句
4.2.1. 处理’don’t knows’类型答案 4.2.2. col 语句中的条件 4.2.3. col语句中其他项 5. 表格 5.1. TAB语句
5.2. AND语句 5.3. 组合表格
5.3.1. 水平或垂直组合 5.3.2. 增加表格
5.3.3. 一个表格的数据除以另一个表格的数据 5.4. 一页打印多个表格 6. 数据检查
6.1. 对HOLECOUNTS进行加权 7. 表格格式
7.1. QUANTUM制表区的层次 7.2. 定义运行控制条件
7.3. 在A,SECTBEG,FLT和TAB语句中的选项 7.3.1. 输出选项: 7.3.2. 数据选项 7.4. 表格标题
7.4.1. 针对T统计表中的标题 7.4.2. 标题下划线 7.4.3. 表格脚注 7.4.4. 在页底部打印文本 8. 产生列标题 8.1. 自动设置 8.2. 手动设置 9. 复杂元素定义 9.1. 计数产生的元素 9.2. 子标题 10. 表格管理 10.1. 表数目 10.2. 页数目 10.3. FLT过滤语句 10.3.1. 全局过滤语句
10.3.2. 命名过滤语句 10.3.3. 过滤语句嵌套 11. 处理数字 11.1. VAL 语句
11.1.1. 检测是否等于算术值 11.1.2. 检测在算术值范围 11.1.3. 组合两种检测 11.1.4. 统计缺失值 11.2. FLD语句 11.3. BIT语句
11.4. 比较BIT语句和FLD语句
11.5. 频数分布(FREQUENCY DISTRIBUTIONS) 12. 统计功能 12.1. 产生合计数 12.2. 其他统计语句 13. 生成和调用文件 13.1. 生成和调用语句 13.2. 生成和调用不同的语句 13.2.1. 列符号参数 13.2.2. 编码符号参数 13.2.3. 给符号参数设置全局值
1. Quantum介绍
1.1. Quantum主要功能
Quantum主要用来从市场研究的一组问卷表中获取有价值的信息。它是一种很完善又很灵活的计算机语言,语法结构和英语相似。
Quantum的主要功能有:
Ø 检查和确认数据 Ø 编辑和校正数据
Ø 生成不同类型的数据打印和报告文件 Ø 生成新的数据文件
Ø 对数据可重新编码和生成新的变量 Ø 产生表格 Ø 执行统计计算
1.2. Quantum运行过程
Quantum从磁盘读入数据,这些数据可以从CATI、CAPI、WEB获得或者就是人工输入的,用Quantum语言写脚本定义好要完成的任务,最后运行脚本处理数据得到输出结果。 Quantum运行程序一般按以下几步:
1. 编译Quantum程序,检查语法并转为C编码(Compilation)。 2. 把C编码转为C程序(Datapass Program)。
3. 用第2步产生的程序读入并处理数据,改正了错误数据或从数据文件中增加新数据后,可以直接从这一步开始往下处理。 4. 对数据进行加权(可选项)。 5. 累计每一单元的数据。 6. 处理数据(可选项)。 7. 输出表格。
Quantum运行命令格式是:
Quantum [options] [program file] [data file] [tables file]
可以不带options值运行所有过程,必须有program file和data file,如果没有给出tables file , 则所有表格输出到 tab_ 中。
Quantum program file data file [tables file]
Options 的值主要有:
-c 编译Quantum程序,转为C编码。 -l 把C编码转为C程序 -r 读入数据进行处理 -o 产生表格
1.2.1. 编译Quantum程序
在所有Quantum运行中第一步都是检查程序语法错误并转为C 编码,我们称这为编辑(compilation),单独运行这一步命令格式为:
quantum –c [program file]
产生主要输出文件有:
out1 列出检查内容,如果有错,Quantum在这个文件中标记出来。 colmap 列出所有列和编码。.
1.2.2. 装入C编码
编译成功后,Quantum把产生的C 编码转为程序,如果没有问题就读入数据,我们称这为(datapass program),DOS下单独运行这一步命令格式为:
quantum –l data file
产生许多中间文件,运行最后被删掉。 DOS下产生主要输出文件有:
qtm_ex_.exe datapass 程序。
1.2.3. 读入数据
通常情况下,Datapass program 自动读入并处理数据,但如果修改了数据或增加新的数据到数据文件中,可以用下面命令重新运行datapass而不用再编译和装入C编码。
quantum –r data file
产生文件有:
clean.q Clean data file dirty.q Dirty data file hct_ Holecount output
lst_ Frequency distribution (list) output
out2 Listing of records failing write and require statements punchout.q Records written out by require sum_ Sorted summary of datapass errors
1.2.4. 产生表格
如果修改了表格的版面而没改变表格单元中的数据(如改变小数点位置,用特殊字符代替0值),则只须运行第一步编辑(compilation)和输出表格这一步:
quantum –o [program_file]
产生文件有:
out3 累积输出概要 tab_ 表格
1.3. Quantum处理数据步骤
Quantum程序分为两个部分:编辑区(edit section)和制表区(tabulation section),编辑区检查和校正数据,产生新的数据文件和变量等;制表区做表和进行统计计算。
2. Quantum安装
2.1. 运行Quantum最低要求
运行Quantum最低需求是:
l PC机上的Intel处理器类型: – any Pentium Processor – i486 (80486 family) – i386 (80386 family)
l 操作系统:
– Microsoft Windows 95 or Microsoft Windows 98.
– Microsoft Windows 3.1 or Windows 3.11 for Workgroups (referred to as 3.x in this guide).
– Microsoft Windows NT 4.0 (for Intel-based systems). – Microsoft Windows 2000 (for Intel-based systems).
– Microsoft MS-DOS 3.3 or later (with HIMEM.SYS v2.78 or later and at least 4MB of available XMS memory configured).
l 硬盘至少6MB可用空间。
l 内存最小8MB 。
l 标准PC并行打印机接口(在使用之前,一个dongle 必须接到并行口,起加密作用,未授权的用户不能使用。
l 安装适合的dongle驱动程序。
l 单独安装C编译器。
2.2. Quantum目录结构
qtime/bin Spss MR公用程序
qtime/qt/qttest 测试安装的一个例子 qtime/qt/v5.7/bin Quantum 所带的程序 qtime/qt/v5.7/doc 当前版本的信息
qtime/qt/v5.7/include Quantum 运行时读取的文件 qtime/qt/v5.7/lib 运行时库文件
2.3. Quantum安装步骤
3. 数据
3.1. 基本元素
在Quantum中有三种基本的元素,它们分别存贮在三种变量中: 数据常量(data constants) 数据变量(data variables) 整数(integer numbers) 整型变量(integer variables) 实数(real numbers) 实型变量(real variables)
3.1.1. 数据常量
单个常量(individual constants)
l 一列中的一个或多个编码,用’codes’表示。编码范围是1234567890-& 和 空值(blank)。 例如:
Red 1 Yellow 2 Blue 3 Green 4 Black 5 White 6
如问题是“你最喜欢的颜色”,最喜欢颜色是”Blue”,则对应列是编码’3’。
l 多选题(multicodes)在一列中对应有多个编码,如’236’。Quantum不关心多编码的输入顺序.如是连续的编码,则可以在第一和最后一个编码间用’/’表示。
’1/3’ 代表 ’123’
’&/4’ 表示 ’&–01234’ ‘4/&’ 表示 ‘4567890-&’
数据常量串(strings of data constants)
一个列区间包含的编码串,用$codes$表示。这里每一列只含一个编码。如$123$。 在表示问卷序列号或问题答案要用多于1位的编码表示时用数据常量串。
3.1.2. 数字
Quantum一般打印10个数字,超出10个输出为 * 号。如”12345678.12”输出1位小数显示为”12345678.1”,输出2位小数则显示为 * 号,但可以用 scale= 来调整。 l 整数(integer numbers)
Quantum能处理整数范围为-1,073,741,824 到 +1,073,741,823,能处理6位有效数,超出6位四舍五入。
数字型问题需要用数字来回答,如“你家里有几个小孩?”
l 实数(real numbers)
包括有小数点的数字,在小数点两边至少有1位数字,也是处理6位有效数,超出6位四舍五入。一般有单精度,如需要双精度用a语句中dp选项来定义。
3.1.3. 变量和数组
数据变量(data variables)
² 在C数组(c array))中的单个数据变量,用 cnumber 表示 ² 在C数组区间中的数据变量,用 c(start_pos,end_pos) 表示 ² 定义数据变量,用 data var_name sizes 表示 ² 在C数组中最大有1000个数据单元,每个单元称C变量(c-variables);每次处理完一个记录时,清空数据单元读下一记录;每一单元对应一列(column)。
整型变量(integer variables)
² 定义整型变量,用int var_name sizes表示,调用用name[cell_number]。 ² 整型变量在运行开始赋为0,在读入不同记录时不会被清空。
² Quantum提供一个有200个整型变量的整型数组(t array), 数组中每一位可含一个整型值。
² 数据变量和整型变量的区别是:如6000要占用4列用4个数据变量来表示,而用整型变量则只要一个来表示。
实型变量(real variables)
² 定义实型变量,用real var_name sizes表示,调用用name[cell_number]。 ² 实型变量在运行开始赋为0.0,在读入不同记录时也不会被清空。
² Quantum提供一个有100个实型变量的实型数组(x array), 数组中每一位可含一个实型值。
² 非零实变量值在运行结束时不自动输出,可用report语句输出。 ² 在C数据中读实数,用cx(start_pos,end_pos) 表示。
3.2. Quantum数据格式
Quantum有三种类型的记录: ordinary record multicard record
multicard record with trailer cards
Ordinary record
Ø Quantum数据自动从数据文件中读到C array中,一次一条记录。 Ø Ordinary record的数据是一串编码或数字,最大有32767个字符。 Ø 对于ordinary 类型记录,从C array的单元1开始向前存放。
Multicard record
Ø Multicard record:当数据从punch card中得来,且每一个记录不止80列,这些数
据就会放在不同卡片上,Quantum给每一条记录安排一个序列号(serial number),每一张卡有一个卡类型号(card type),根据记录序列号和卡类型号Quantum就可以决定哪些数据属于哪一个被访问者。
Ø Quantum每个记录最多有327张卡。这里处理的卡每张卡最多100列。
Ø 对于multicard类型记录,一般card 1放在c101-c200,card 2放在c201-c300,如此类推。
如果是80列的卡,card 1读入到c101-c180, card 2读入到c201-c280等,c181-c200,c281-c300等为空,这个C array 假设为10行,每行100列。则第2张卡的第30列用c230来表示,而c867表示第8张卡的第67列。
Multicard record with trailer cards
Ø Multicard record with trailer cards :有些记录含有重复的数据,我们把重复的数据的每一组放到一张独立的卡中,Quantum给这些含有相同问题的卡安排了一个卡数目(card number),这些卡被称为:trailer card。
Ø 如在一个购物调查中,针对被访问者光临的每个商店,都是一列相同的问题。那么对每个商店设一张独立的卡。假设被访者到过5个商店,我们把被访者基本信息放在card 1中(card type为1),商店的信息放在card 2中(card type为2),那么这条记录包含5张卡类型为2的卡,一共含6张卡。Card 1的层次(level)高,card 2的层次低。
3.3. 数据结构
所有处理multicard record 的程序必须包含一个struct结构语句,除非记录类型是trailer cards且在读入和制表时用到层(level)的功能,在这种情况下可以选择用struct语句或用level文件,如果没有struct语句也没level文件,则当作ordinary record 对待。
定义数据结构的语句格式是:
Struct;options
Options有多种:
记录类型(record type) Struct;read=n
n =0 ordinary 记录,数据从c1开始往上放在c array中。缺省值。 n =2 muiticard记录,每张卡记录读到卡类型对应的行中,如card 1 在c(101,200), card 2在 c(201,300)中,如此类推。
n =3 忽略卡类型,一次读入multicard记录
记录长度(record length) Struct;reclen=n
定义长度大于100列的记录长度,也就是能读入到c array中的最大字符数。通常缺省为reclen=100.
如果是multicard record 输出,c101到c(100+reclen),c201到c(200+reclen)等记录输出。 例如:
struct;read=2;reclen=60
假设有2张卡,则输出c101-c160和c201-c260.
序列号(serial number) Struct;ser=c(m,n)
每一记录的序列号在c array中的位置。 例如:
对于ordinary record,序列号在列1到5: struct;read=0;ser=c(1,5)
对于multicard record,序列号在列1到5: struct;read=2;ser=c(1,5)
注意这里multicard record中序列号用的是实际的列号而不是带卡类型的列值来表示。
卡类型(card type location) Struct;crd=cn 或crd=c(m,n) 只对multicard 有用,定义卡类型。卡类型是1位数用cn表示,多于1位数用c(m,n)表示。这里m,n都是实际的列值而不是卡类型加列值。 例如:
struct;read=2;ser=c(1,4);crd=c5
是multicard 类型记录,每张卡序列号在column1到column4,卡类型号在column5.
必须存在的卡类型(requird card types) Struct;req=card_numbers
有时候有些卡是可选的,有些卡是必须存在的。req= 定义在记录中必须有的卡类型,只对multicard 有用,可用逗号分开独立列出,也可用start:end或start/end列出。 例如:
struct;req=1,2
定义在每个记录中必须有卡1和卡2,其他卡是可选的。
重复出现的卡类型(repeat card types) Struct;rep=card_numbers
定义哪些卡在记录不止出现一次,只有定义了read=2和crd 后rep才有意义 例如:
struct;read=2;ser=c(1,4);crd=c5;rep=1,2
最大卡类型数 (Highest card type number) 每个记录超过了9张卡,要在这里定义。 struct; max=n
4. 轴(axes)
轴是表格的一部分,可生成表的行(row),表的列(column)等。轴中每一项称为元素(element)。 轴元素类型有:
1. 文本和条件元素:包含文本和条件,即一个被访者包括在该元素中应有特征。 2. 文本元素:只产生文本,不包括其他。 3. 算术元素:元素包括算术值。
4. 统计元素:合计、小计及一些统计功能如均值和标准差。
4.1. 轴定义
定义轴的格式是: name [;option]
options有很多选项,下面列出几个常用的: c=logical_expression
² 定义轴中元素要满足的条件
² 条件定义被访者的特征,只有满足条件的记录才能在这个元素中。
² Logical_expression是一个逻辑表达式,结果为真时,该单元合计数加1,否则不变。 ² 如 c=c234’12’ c234列中至少含编码’12’中任何一个元素为真 c=c234n’12’ c234列中不含编码’12’中任何元素为真
c=c234=’12’ c234列中只含编码’12’为真
c=c234u’12’ c234列中不等于编码’12’时为真
c=numb(c163,c171,c175).eq.1 列163,171,175编码合计数为1时为真
inc=arith_expression
² 表中这个轴单元值合计时根据上面数学表达式的值而不是加1。 nz
² 所有单元值都是0时该元素在打印报表时被忽略。
4.1.1. 特殊条件
用来处理Don’t know 和No answers之类编码的记录的条件
C=- 统计从最后基本元素后没有出现满足轴条件的被访问者。 c=-n 统计最后n个元素中没有出现满足轴条件的被访问者。
产生’net’元素,用来处理多选题和开放题的条件
c=+ 从最后基本元素后出现在任何元素中的被访者合计 c=+n 统计最后n个元素中出现的被访问者。
4.2. Col语句
可以定义相同一列(column)中带编码的多个元素,可以代替一组n01语句。 语句格式为:
col number;[base;]elm_txt1[=’code1’][;elm_txt2[=’code2’]…] number 列编码
base 产生base元素
elm_txt n 定义每一元素的文本 coden 为编码
² 如在col语句中只包含元素文本,未含编码,则假定这些答案是单选题且按1234567890-&和空(blank)顺序为元素自动编码。
² 可以对其中一个或几个元素指定编码,未指定编码的第一个元素编码为’1’;中间有元素指定编码的,后面未指定编码的跟着前面自动编码的元素编码。 ² col语句12个编码后编码为空(blank)。
² 编码可以用联合列出,相当一个’or’条件。如 red/green=’12’
² 因为‘;’是每一元素分割符,如果‘;’是文本一部分,则要把 ‘\\’符号放在‘;’ 之前。
² 用’+’可以把一个col语句分为多行,要在‘;’后分开语句。
4.2.1. 处理’don’t knows’类型答案
产生一个元素统计包括在base中但不包括在其他元素中的被调查者。 等于n01语句中c=- 条件。
语句格式为:
col number;…;element_txt=rej
4.2.2. col语句中的条件
用 = 统计一列(column)中只包含对应元素中编码而没有其他编码的被调查者的数目。是精确的等于(exactly equal to) col=number;…
例:
l child1
col=114;base;under 5;aged 5-10;aged11-15;aged16-18
相当于写c=c114’1’ ,under 5元素统计只有5岁以下小孩的家庭。
4.2.3. col语句中其他项
在col语句中产生一个base项。 语句格式为:
col number;base[=text];…
如果后面带text,base元素文本为text内容,否则为base标识。
col语句中的子标题 语句格式为:
col number;hd=sub_heading_text;… 同axis轴中的n23语句功能一样。
col语句中只含文本的元素 语句格式为:
col number;tx= text;…
定义只含文本的行,在列中则被忽略。
5. 表格
由轴产生表,表中每一单元值由横轴(行)和纵轴(列)的条件决定。
5.1. Tab语句
语句格式为:
tab [axis1] [axis2] [axis3] [axis4] row_axis column_axis[;options] ² 每一个都需要一个独立的tab语句。
² 可以做多维表,最多可以有6维。多维表是一组表有相同的行和列,但组中的每一个表都有由另外的轴定义的特征。 例如:基本表 tab age ***
现在我们需要根据不同的地区不同年龄不同性别统计数。 三维表 tab region age *** 设region 有5行: l region
col 125;base;hd=area of residence;north;south;east;west 将产生5个表:
base:age by ***(包括所有被访问者) north:age by *** south:age by *** east:age by *** west:age by ***
5.2. and语句
一列表有相同的轴,用and语句形成的每一个表和每一页的表数目和页数目是不同的。 and[n] axis1 [axis2…] 例如: tab ax01 bk01 tab ax01 bk02 tab ax01 bk03 tab ax01 bk04 可以写成:
tab ax01 bk01
and bk02 bk03 bk04
5.3. 组合表格
把表格水平或垂直组合,把它们内容加到一起或分开。
Sid 把当前表格放到前一个表格右边
Und 把当前表格放到前一个表格下面 Add 把当前表格内容加到前一个表格中
Div 用前面表格的数据除以后面表格的数据
² 这些语句不单独使用,他们通常跟在一个tab语句之后。
² 用这些语句把表格组合在一起,表格单元数都要一样,如果表格小一些,要填充一些哑单元去使表格一样。
² and语句也会相同行或列轴的表,它们每一个表都打印在单独一页中,比较数据困难 ² sid或und语句使不同表打印在同一页,可以横向组合或纵向排列。
5.3.1. 水平或垂直组合
水平组合:
sid row_axis column_axis [;options] 例如: tab rating *** sid rating region
² 整个表格的宽度不能超过定好的表格宽度。(用pagwid定义)。 ² 表格必须是两维的。
² 所有表格必须含有相同的行数。
² 在一个tab语句之后最多可有40个sid语句。
² 如果不止一个表含有诸如均值(n12)和标准差(n17),则在用axis轴中n25语句产生统计,而不是用因子(factor)。如果用因子,组中第一个表定义的因子会覆盖随后的表格。 ² 如果tab表和sid表都有base列,则用对应的base列去产生行百分数。
² 如果tab表中有base列,而sid表中没有,则所有表中的行百分数根据tab表中的base列产生。
² 如果tab语句中没有base列,而sid表中有一个,则side 表产生行百分数而tab表不产生。
垂直组合:
und row_axis column_axis [;options] 例如: tab lq1 ban1 und lq2 ban1 ² 表格必须是两维的。
² 所有表格必须含有相同的行数。
² 所有表格的元素个数不能超过500个。
5.3.2. 增加表格
语句格式为:
add [row_offset[,col_offset]]axis_names ² axis_names的个数和tab语句中一样。 ² 相加的结果放在tab表中。
² 两个表相加最简单的办法是把两个表对应的行依次相加。
例如:我们调查每一个公司拥有的打印机,第一个表存放不同商标的手动打印机,第2个表存放不同商标的电子打印机,最后我们要一个表显示拥有每一个商标的打印机数。 tab manbrd comsiz;c=c(123,149)u$ $ add elecbrd comsiz;c=c(151,175)u$ $ l manbrd n10base
n01brandA;inc=c(123,125) n01brandB;inc=c(126,128) …
l elecbrd n10base
n01brandA;inc=c(151,153) n01brandB;inc=c(154,156) …
5.3.2.1. 相加表的偏移(offset)
² 表在相加之前可向右或向下偏移指定的列数或行数。
² 多个表相加表偏移是基于tab表,而不是一些中间的add表 表偏移指定的列数 addn axis1 axis2 表偏移指定的行数
addm,0 axis1 axis2,,,[axis6]
在同一表中同时设置向下和向右偏移的行数和列数 addm,n axis1 axis2,,,[axis6]
5.3.3. 一个表格的数据除以另一个表格的数据
语句格式为:
div axis_names [;options]
² axis_names的个数和tab语句中一样。
² tab语句中定义的表是“分子”,div语句中定义的表是“分母”。 ² 一个tab语句后只能跟一个div语句,且两个表要有相同的行数和列数,用tab表中单元除以div表中对应的单元。
例如:tab表中是被访问者购买的总面包数,div表中是购买面包的总人数,它们相除得到平均每个人购买的面包数。
tab ax06 loaf;inc=c(132,133);dec=2 div ax06 loaf
5.4. 一页打印多个表格
一页打印多个表格有多种选择,由以下两个语句控制: hitch=number
number范围为0-4,把当前表第一页跟前面表格打印在同一页。
² hitch=1 把当前表第一页跟前面表格打印在同一页,但空间不够当前表第一页就分页打印。
² hitch=4 如果两表有相同列,可以把一个表的行粘贴在另一个表的后面,使它们打印后看起来象一个表。
squeeze=number
squeeze范围为0-2,只要有空间,在同一页尽可能多打印当前表的页。 ² squeeze=1 打印又短又肥的表格,在同一页尽可能多的打印。
² squeeze=2 控制表头(titles)、脚注(footnotes)、底部文本(bottom text)的输出 ü 忽略第一页底部文本。
ü 如果和第二页的脚注相同,忽略第一页脚注。 ü 如果和第一页的表头相同,忽略第二页脚注。 ü 从第一页的脚注和底部文本间开始打印。
可以在a 语句中用a;nopage;notbl选项控制page numbers,table numbers不输出。可以用选项a;physpag 控制输出物理页数(physical page numbers) 而不是逻辑页数(logical page numbers)。
6. 数据检查
数据一读入到c array中,就可以检查数据。这里我们介绍用holecount对数据进行检查。 Holecount 可以显示每一列总的编码数。用来在写编辑程序前了解数据全面的情况。 ² 编码的分布---例如,在column 56有多少被访问者选择了编码2。
² 编码的密度---例如,在一列中有多少被访问者选了一个、两个、三个或多个编码。检查某列是否应该是多选题
² 在整个数据文件中编码的总数
语句格式是:
count c(start_col,end_col) [$text$] ² text是打印在每一页上的题头,可选项。
例如:count c(101,108) $Demonstration Survey$
² 在holecount标题中,Quantum接受双引号,但C编译器不接受,所以在双引号之前要用”\\”符号。
² 可以对或多或少的列进行统计,只要这些列是连续的。
² 对holecount进行过滤,满足特定条件的记录将被合计。
例如:if (c106’1’) count c(101,108) $Demonstration Survey_Male$ ² 对trailer cards进行统计
通常,所给类型的trailer cards被当作一张卡,一起合计,所以列的计数包括所有的trailer cards的编码。
有时需要在一组trailer cards中合计某一张特定卡,如某张trailer card是第5张卡,存在c79中,则用:
if (c579’1’) count c(501,580) $Harrods$
6.1. 对holecounts进行加权
语句格式是:
count c(start_col,end_col) [$text$] c(m_start,m_end)
² c(m_start,m_end)是c array中存放的对每一记录的乘数(权值)。
² 在一般holecounts中,每一单元只是对记录进行简单的计数。包含给定列中某个特定编码的记录被读入,对应单元加1。
² Holecounts也可以不是简单加1,而用c(m_start,m_end)含的值来增加。 ² 如果权值是实数,则用 cx(m_start,m_end) 来表示。 ² 权值可以事先写定也可在编辑过程中计算。 ² 合计数最后四舍五入。
7. 表格格式
7.1. Quantum制表区的层次
Quantum制表区是分层次的,在某一层定义的特征将适用于这一层及下面所有层,单行语句是最低层,从最低层开始逐渐向上增加,在当前层定义的条件和特点被当前层和低层接受。 低层的特点覆盖高层的特点,tab语句定义的特征覆盖a语句定义的,而一些对单行定义的特点则覆盖tab语句或a语句中定义的特点。
制表区程序主要的内容有:
² 运行控制语句:决定运行的总特点,包括对所有表的文本常量,过滤条件,表格头等的定义。主要是a 语句。 ² 表格控制语句:定义交*作表的轴,这些语句定义每一个表的文本和一般特征。主要是tab 语句。
² 轴控制语句:每个轴包含一组语句,用来建立表的行与列的文本及条件。
7.2. 定义运行控制条件
在作表区开头第一个语句定义全局缺省的运行条件。 语句格式:
a;opt1[;opt2…]
opt选项将在下一节讨论。
例如:a;dsp;op=12;date;dec=1
dsp double-spaced缩写,每一行之间有一空行。 op=12 每一单元包括绝对数值和列百分数。
date 每一页右上角打印日期,格式是dd mmm yy . dec 小数点的位置。
7.3. 在a,sectbeg,flt和tab语句中的选项
这些选项分为两类:
输出选项:决定运行中每一个表格式,但与表中每一单元内容无关。改变后无需重读数据就可重运行。
数据选项:决定每一单元合计数怎样产生,但与表输出格式无关,改变后需要象新的job一样重新运行。
7.3.1. 输出选项:
dec=n 小数点的位置,即包含几位小数。
decp=n 百分数中小数点的位置,当op=0,2,7,或&时适用。 dsp 表中每一行数据间有一空行。
flt=name 调用flt语句中定义的过滤条件和表头,这个选项在sectbeg,flt和tab语句中
有用,但在a语句中无效。
flush 让百分数和绝对数值向右齐平一行一行地打印。
Hitch 把当前表和前一个表打印在同一页,如果当前表有多页,则把第一页和前一个表打印在同一页。但如果空间不够打印整页表,则换页。 op 表的输出类型
& ---总数百分数,根据整个表的base(表的左上角显示)来计算。 0 ---行百分数
1---绝对数值(缺省)
2---根据当前base列计算列百分数
6---根据表格中第一个base列计算列百分数 7---累积百分数 8---指数(indices)
pagwid=n 表格每一页宽度,缺省为132个字符,可以加大。
physpag 打印物理页数而不是逻辑页数,与squeeze,hitch配合使用。 side=n 定义行文本的宽度。
spechar=ab 当一单元值为零时,用特定字符去代替。 a---单元值为0
b---单元值四舍五入为0
nzrow 一行所有单元均为0时不打印 nzcol 一列所有单元均为0时不打印
7.3.2. 数据选项
c=logical_expression
记录包括在表中需要满足的条件。
dp 在a语句中有用,用双精度计算单元值。缺省是单精度。 Inc=arithmetic_expression
单元值根据数学表达式的值来累计,而不是计数加1。
7.4. 表格标题
语句格式是:
ttxtitle_txt[< title_txt 打印在表格上的标题内容 < ttl 在一页中向左对齐。 ttr 在一页中向右对齐。 ttc 在一页中间打印 ttn 缩进10次n个空格 tta 奇数页向左对齐,偶数页向右对齐 ttb 与tta相反,偶数页向左对齐,奇数页向右对齐 表格标题反映表格的不同层次: ü a语句后的tts定义的是整个运行的标题,打印在每一页的最上面。 ü Flt语句后tts定义的是一组表的标题。 ü Tab语句后tts定义的是特定表的标题。 ü 在l语句后轴定义的tts在横轴中打印,在纵轴中则被忽略。 标题打印的顺序可以用a语句、flt语句、tab语句中ttord,ttbeg,ttend来规定,缺省打印顺序是: 1. a语句后tts 2. tb语句中的表数目 3. 行l语句(横轴)后的tts 4. tab语句后的tts 5. flt语句后的tts 6. flt=语句后的tts 7. 以”BASE”打头的tts 7.4.1. 针对T统计表中的标题 ttxtitle_text;tstat 7.4.2. 标题下划线 ttxtitle_text;unlnumber ü unl1 整行加下划线一直到最后一个非空字符 ü unl2 和unl1一样,当空字符串除外 ü unl3 只在非空字符下加下划线 7.4.3. 表格脚注 在表格每一页最后一行后打印的标题。 格式是:foot 后跟tt语句。 只想在最后一页打印脚注,在表格区程序最后用n03s来代替foot语句。 可以在不同层次定义脚注,a语句、flt语句、tab语句和l语句均可定义,每一层在foot后可定义30个tt语句。 Quantum假设所有标题打印在页上面,直到读到foot语句,foot语句之后的标题都属于这个foot的脚注,直到另一个foot语句出现。 直到同层次的另一个脚注被读到,在某一特定层的脚注一直起作用。 关掉脚注,是在foot语句后跟一个空tt语句。 7.4.4. 在页底部打印文本 格式是:bot 后跟tt语句。 8. 产生列标题 定义列标题(breakdown或banner)。 ü 完全自动产生,标题用元素文本,列宽度自动计算。 ü 半自动产生,标题用元素文本,列宽度用a,sectbeg,flt,tab或l语句中的 colwid= 来定义。 ü 手动产生,用g语句定义标题文本,p语句定义列宽度。 8.1. 自动设置 列标题最大宽度 head_width = pagwid – (side + %_sign + pcpos_value) pagwid 页宽度,缺省为132 side 行文本宽度,缺省为24 %_sign 每一行最后一列打印%符号的位置 ü 列宽度自动计算,列标题用行文本。用列标题最大宽度除以列数得出每一列宽度。 ü 最大列宽度为16,最小为8。大于16设置为16,小于8也设置为8。 ü 所有标题自动产生,轴标题(l语句中的hd=)列在所有标题中央,包括base列。 ü 轴的子标题(用n23语句,或col 与val语句中hd= 定义的标题)列在对应列中央。 ü 每一列标题(从n01/col/val语句中产生)在列宽度范围向右对齐,如果太长分行,从空格/连字符/反斜线处分开。 l region;hd=Area of Residence col 15;Base;hd=London;Inner London;Outer London; +hd=Southern England;Cornwall/Devon;Kent/Surrey/Sus***; ... Area of Residence London Southern England Kent/ Inner Outer Cornwall/ Surrey/ Base London London Devon Sus*** 用hdlev= 产生嵌套标题。 例如: l ban01 n23Visitors to the Museum;hdlev=1 n10Base n23Sex;hdlev=2 col 110;Male;Female n23Age;hdlev=2 col 111;11-20=’12’;21-34=’34’;35-44=’56’;55+=’78’ n23Visited;hdlev=2 n23Museum Before;hdlev=2 col 116;Yes;No 输出样式为: Visitors to the Museum Visited Sex Age Museum Before Base Male Female 11-20 21-34 35-44 55+ Yes No 8.2. 手动设置 l 标题文本 定义格式为: g col1_text[ col2_text ... ] 一个轴可以包括最多20个成组的g语句以形成列标题。 g Marital Status g Base Single Married Divorced Widowed g ------ ------- --------- ---------- ---------- l 列打印位置 定义格式为: p x [x .... ] l ax04 col 109;Base;Single;Married;Divorced;Widowed g Marital Status gBase Single Married Divorced Widowed p x | x | x | x | x 产生标题格式为: Marital Status Base Single Married Divorced Base 200 | 44 | 122 | Male 44 | 6 | 27 | Female 156 | 38 | 95 | Widowed 33 | 1 10 | 1 23 | 0 9. 复杂元素定义 9.1. 计数产生的元素 n01 n15 n10 n11 用一些简单或复杂的条件产生基本元素 同n01语句相同但元素不打印 产生一个基于base的百分数 同n10语句相同但元素不打印 n01语句 格式是: n01[element_text] [;options] 产生列的基本计数元素。 例如:n01Married;c=c109’2’ n15语句 格式是: n15[text] [;options] n10语句 格式是: n10[text] [;options] 例如:n10base 表中第一行和列包含合计数,它们是行或列满足条件的被调查者总数。Base行和base列交*点就是表的base数。 Base不同于Total,total是表中实际数合计,而base是指符合表中条件而不是表中实际数的合计。 n11语句 格式是: n11[text] [;options] 9.2. 子标题 n03 产生只有文本的元素 n23 产生一个子标题 n33 继续长元素文本 产生额外文本 n03[element_text] [;options] 经常用来产生空行(没有文本)。 例如: l mstat n10Base n03 n01Single;c=c109’1’ n01Married;c=c109’2’ 轴的子标题 n23heading_text[;hdlev=header_level_number][;toptext=col_header] [;options] 用hdlev=keyword定义子标题的层数,从1到9,1层最高,高层打印在上面,层数可以不连续。打印位置都是在对应列的中央。 可用toptext= 定义一个打印的标题来代替heading_text 。 继续长文本元素语句 n33continuation_text n33语句用在n01或n10语句之后,主动分行继续输出长文本。 n00 按照设定条件过滤记录。设定的条件适应于后面连续的行,直到另一个n00语句出现。 n00;c=logical_expression l pref1 col 321;Base;Liked Product;Disliked Product;DK/NA=rej n03 n00;c=c321’1’ col 322;hd=Reasons for Liking Product;Cleans Well; +Lasts a Long Time;Smells Nice; .... n03 n00;c=c321’2’ col 325;hd=Reasons for Disliking Product;Inconvenient to Use; +Too Expensive; .... n09 手动分页 可以用语句控制新表在轴上开始的点。 n09 [continuation_text] [;hug=num_elms] [;options] continuation_text 打印在下一页左上角位置。 Hug=num_elms 当前页剩几个元素时开始新的一页。 当有squeeze 和 hitch关键字时,Quantum忽略n09而按照squeeze,hitch打印表格。 10. 表格管理 10.1. 表数目 格式是: tbx[number][;nand] x决定表数目在一行中的位置。 l 左面 r 右面 c 中间 a 奇数页打印在左边,偶数页打印在右边 b 偶数页打印在左边,奇数页打印在右边 nand 强迫and语句产生的表要和父tab语句的表树木一样。 number 是随后tab语句产生的表数目。 如果表数目是连续的,只需不带参数的tb语句。 如果表数目是不连续的,tab语句之前要用带合适数字的tb语句,强制表数目为一特定数。 And语句产生的表都有一个独立的表数目,如果带nand,则可强迫and语句产生的的表和父tab语句的表数目一样。 Notbl不打印表数目。 用notbl关闭自动表数目,在tt语句后定义表数目,且带《tab》符号指定表数目打印位置。 例:tab age *** ttlTable 《tab》:Age by Sex 表一产生,Quantum将用表数目替换《tab》,向左看齐打印标题。 10.2. 页数目 pag number 下一个表页数目,可设定单独的页数目,通常打印在右上角,除了在a,flt,或tab语句中用nopage不打印页数目。 Nopage只是不打印页数目,每一个新页还都有依次增加的页数目。 10.3. flt过滤语句 过滤语句在表格层次中的第2层,定义的条件、选项和文本适用于随后所有表,直到另一个过滤语句覆盖它。 过滤语句有两种形式:全局(flt)和命名(flt=). 10.3.1. 全局过滤语句 语句格式是: flt[;c=logical_expression][;options] 如: flt;c=c106’2’;nz;decp=2 ü 后面所有表只包括106列编码为’2’的记录 ü 忽略所有单元均为0的行 ü 百分数显示2位小数 表格中不同层之间的c= 定义的逻辑表达式是 and 的关系。其他条件是低层的覆盖高层的。 如: flt;c=c106’2’ tab occup region;c=c132’1’ ttlBase: Women in Full Time Employment 在我们表中是一个 ‘and’ 条件: c=c106’2’.and.c132’1’ 在全局过滤语句后可有and 和tt语句,前者列出轴的更高维数,后者定义所有表头的打印标题。 flt语句后可跟foot和bot语句,每一个后面的tt语句定义的标题也是全局的,适用于后面所有表。 fit在一组表有相同的过滤条件时很有用,或者用不同过滤条件多次产生一组表。 可以用一个空的flt语句停止前面的flt语句以及tt,and语句定义的选项。 10.3.2. 命名过滤语句 语句格式是: flt=name[;c=logical_expression][;options] 命名flt过滤语句可以提高效率。 使用命名过滤器就是在每一个tab语句后跟一个flt=name,命名flt语句只在调用tab语句中有用,而且不覆盖以前的全局flt语句定义的条件,而是一个附加关系。 例如:定义命名过滤条件 flt=male;c=c106’1’;op=120 ttlMales 调用: tab ax01 demo;flt=male 10.3.3. 过滤语句嵌套 嵌套过滤区开始: sectbeg[; c=logical_expression] [;options] 嵌套过滤区结束: sectend 有时一组表有相同的标题和过滤条件,但组内有些表需要附加标题和过滤条件,一个有效的 方法是用过滤语句嵌套。过滤嵌套是把表分为组,外面组的过滤条件和标题适用于组内所有表,里面组的表可以定义自己附加的标题和过滤条件。 在sectend之前可以有10个sectbeg,连续的sectbeg语句而不被sectend插入,说明在主制表区开始了一个子制表区(table subsection),当遇到第一个sectend子制表区结束,然后主制表区遇到另一个sectend才结束。子制表区的所有过滤和选项设置附加在主制表区的过滤和标题之后。 11. 处理数字 11.1. val 语句 val语句定义表元素的条件是变量等于一个算术值或在值的一个范围,是针对数值类型答案而不是编码类型答案。如家庭人口数或电话号码。 11.1.1. 检测是否等于算术值 Val语句格式是 val variable;[Base];[hd=Text];=;[tx=Text];n1 [Text1]; ... ;nn [Textn] 检查变量是否包含特定值,相等则对应单元值加1。 Variable是data,integer或real类型变量,变量值将与n1到nn的值比较,Text1到Textn是被打印出来的行文本。 每个n [Text] 必须包含一个数字,数字位置则不限定。 例如: 我们假设c(110,111)包含家庭人口数,我们想做一个表显示多少被访问者家中分别有1,2,3,4,5,6个人。 val c(110,111);base;hd=Number in household;=;1 Person;2 People; +3 People;4 People;5 People;6 People 如果c(110,111)的值等于1,则被访问者包含在第2行(第1行为base)中,如果等于6,则包含在’6 people’行中。 如果数字不是元素文本的一个有效部分,则可以用以下格式(文本后用=隔开): val c(132,133);Base;hd=Brand Bought Most Often;=;Brand A=77; +Brand B=79;Brand C=81;Others=rej c(132,133)包含最常购买商标编码,如果c(132,133)=$77$,最常购买的是Brand A,c(132,133)=$79$,最常购买的是Brand B。前面元素中都不包括的放在others行中。 如果元素中只包括数字,且数字每次加1,则可以用以下格式: val c(m,n);Base;=;start:end start:end 中间不能有空格。用start:end范围内数字做行或列文本。 11.1.2. 检测在算术值范围 包含在表元素中的条件是变量值在给定范围内。 下面两种格式要输入最小和最大值,用 ‘-‘ 或 ‘/’ 分开。如果没给上限,假设是无穷大。 语句格式是: val variable; i ;min1–max1[element_txt1];min2–max2[element_txt2] ... i表示最大值包括在给定范围内。 val variable; r ;min1–max1[element_txt1];min2–max2[element_txt2] ... r表示最大值不包括在给定范围内。 例如: val c(110,111);Base;hd=Size of Household;I;1-2 People; +3-4 People;5-6 People;7 or More People 如果c(110,111)的值在1-2之间,则被访问者包括在’1-2 people’行中。 11.1.3. 组合两种检测 在一个val语句中,操作符= , I, R可以联合使用。 l hshld val c(110,111);Base;hd=Size of Household;=;1 Person;2 People; +I;3-4 People;5-6 People;7-8 People;9 or More People 11.1.4. 统计缺失值 记录如果缺少数据而不满足val中所有条件,所以val语句中产生一个元素去统计这些缺少数据的记录。条件是missing_. l rental val c(9,10);Base;i;None=0;1-5;6-10;11-20;21-30;31+; +=;DK/NA=missing_ 11.2. fld语句 表中元素要满足条件是一个域(field)包含一个特定数值编码(numeric code). 语句格式是: fld col_specs;[base[=btext]];[hd=hdtext];[tx=text];element_specs col_specs定义被读的列,有三种方式输入: 1. 一个接一个列出每一列,用,隔开: 如fld (c(12,13), c(14,15), c(16,17)) 2. 如果是顺序域,可以用每一个域开始列和域的宽度来定义: fld (c12, c14, c16) :2 3. 如果不是顺序域,可以写出开始列和每一组域宽度,用 / 分开每一组: fld c12, c16 / c52, c56 :2 将读c(12,13), c(14,15), c(16,17), c(52,53), c(54,55) and c(56,57). element_specs定义元素的文本和答案对应的编码,只输文本则顺序编码,也可以自己编码。 例如:统计看过每一个电影的人数, fld(c12,c14,c16):2; Columbus;Aliens 3;Pretty Woman; +Green Card;Batman 2 答案编码不是顺序的或不希望它们顺序列出,则在元素文本后跟= 和对应编码,一个元素对应多个编码,用逗号隔开,如是一个区间,则把开始编码和最后编码用连字符隔开。 fld (c12, c14, c16) :2;Science Fiction/Fantasy=2,5;Historical=1; ++Others=3-4 象No Answer 或Don’t know 之类没有数字编码,则可以用$&&$来表示: fld (c12, c14, c16) :2;Columbus;Aliens 3;Pretty Woman; +Green Card;Batman 2;None of these=$&&$ 11.3. bit语句 bit语句是根据从编辑区产生的整型数组来合计数据。 Field和bit语句一起完成fld功能,bit根据field语句统计的数据来作表。 语句格式是: bit array_name; element_text1;element_text2; ... array_name 是field语句中产生的整型数组,element_text是元素的文本和编码。 例如: bit films;Columbus;Aliens 3;Pretty Woman;Green Card;Batman 2 当films数组元素1大于0时,Columbus统计数加1,而不是加films数组元素,是统计多少人看这个电影,而不是这个电影被看多少次(一个人可以重复看)。 Bit也可以象fld一样让答案不用顺序排出: bit films;Science Fiction/Fantasy=2,5;Historical=1;Others=3-4 当数组films单元2和(或)单元5值大于0时,Science Fiction/Fantasy合计数将加1;单元1大于0时,Historical合计数加1;单元3和(或)单元4值大于0时,Others合计数加1。 11.4. 比较bit语句和fld语句 当有数值编码,简单统计被访问者人数,用fld比field/bit语句简单和快速。 如要合计单元值,而不是简单加1,则要用inc= 选项,但如果是数值编码,则inc= 不可能用,要用field/bit代替fld. 例如:统计每部电影被看的次数 bit films;Base;Columbus;%inc=films1;Aliens 3;%inc=films2; +Pretty Woman;%inc=films3;Green Card;%inc=films4; +Batman 2;%inc=films5 11.5. 频数分布(Frequency distributions) 频数分布检查域中包含的字符或数字数据。这样可以决定什么样数据可以被分组作表,也可粗略估计中值。 产生频数分布 产生一个按字母和大小次序排序的频数分布,语句格式是: list c(start_col, end_col) [$text$] 只按字母排序用 lista c(m,n) [$text$] 只按大小次序排序用listr c(m,n) [$text$] listr c(107,108) $Contents of cols 7 and 8$ lista c(t1,t1+4) $First Set of Car Brands$ 每个频数分布表包括两个部分,第1部分域的值按字母或数字次序排序,第2部分按每个值出现的次数排序。每个频数表包括绝对值和累积数,及对应的百分比。 最后Quantum打印: ü 不同的数据值 ü 每个值出现的次数 ü 所有数据的总和(按出现次数累计) ü 所有数据的均值 ü 所有数据值的标准差 例如:列出column123 到 column125的频数分布: list c(123,125) $PRICE PAID$ 12. 统计功能 Quantum强大功能之一就是产生不同类型的统计数据,不需了解特定的公式。 12.1. 产生合计数 产生一个合计(total) no4[element_text] 产生一个小计(subtotal) no5[element_text] ü 所有从n01,n15,col,val,fld,bit语句产生的行或列都可用n04,n05语句来统计。 ü 如果n04语句放在表头和base之间,产生一个表头和base之间的合计。 ü n04语句放在base与表底之间,产生一个base与表底之间的合计。 ü n04语句放在两个base之间,产生这之间的合计。 ü 如果这其中有一行是小计(n05),n04语句会忽略该行的数据。 ü n01,n05均不受n00的影响。 /* Bread buyers have C125’1’ /* Number of loaves bought is in C(132,133) tab ax04 loaf;c=c125’1’ ttlBase : Respondents Who Bought Bread l loaf;inc=c(132,133) n10Base;noinc val c(132,133);hd=Number of Loaves Purchased Last Month +i;1-5;6-10;11-20;21-30;31+ l ax04 n10Base n23Bought from Supermarket col 130;White;Wholemeal n05Subtotal n03 n03Bought from Baker’s col 130;White;Wholemeal n05Subtotal n03 n04TOTAL 12.2. 其他统计语句 n07 n12 n13 n17 n19 n20 n30 n31 average mean sum of factors standard deviation standard error of the mean error variance of the mean medians and percenties effective base 语句格式是: naa[text];[options] 13. 生成和调用文件 在Quantum中常用语句可独立写成一个文件,需要时在主程序相应位置调用。如一组轴或表控制语句常被单独写成一个文件。这样可提高效率。 可以使用符号参数(symbolic parameters),每一次调用用不同参数值调用。 13.1. 生成和调用语句 包含一个数据文件或Quantum语句文件。 语句格式为: #include file_name ü 相当于用不同的过滤条件来制作一组表,表用相同的语句生成。 ü 需要时在主程序相应位置调用,如在不同目录,要给出完全路径。 ü 可以嵌套调用。 例如:要制作不同地区居民的一组表,对每个地区我们要求表格是: tab brand demo ttcBrand Bought Most Often tab prefer age ttcBrand Preferred tab demo bk01 ttcDemographic 可以用过滤语句flt对不同地区来作表,但需要重复多次如: flt;c=c121’1’ ttlBase: Respondents Living in Central London tab brand demo ttcBrand Bought Most Often …… flt;c=c121’2’ ttlBase;Respondents Living in Outer London tab brand demo ttcBrand Bought Most Often …… 我们可以把上面相同作表语句生成一个新文件,如命名为tab1.再用include语句来改写这段程序: flt;c=c121’1’ ttlBase:Respondents Living in Central London #include tab1 flt;c=c121’2’ ttlBase:Respondents Living in Outer London #include tab1 …… 13.2. 生成和调用不同的语句 有时Quantum程序包含一组相似但不同的语句,Quantum可以把这一组语句作为一个文件,用符号参数来代表变化的那部分。每次调用时用参数实际值来调用。 符号参数(symbolic parameters) 一列问题有相同答案列表时经常使用,它们不同地方只是列号或答案编码,可以把列号或编码当作符号参数,运行时用不同值去调用。 13.2.1. 列符号参数 定义列符号参数: col(letter)=column_number 使用列符号参数: cletter number 列符号参数格式是: cann ü a是任意大小写字母,除了C,N,T,U,X或其他用户自定义的变量名。 ü nn是任意整数。 例如:符号参数是b00,下面语句命名为ifil文件, n01prefer Product A;c=cb00’1’ n01prefer Product B;c=cb00’2’ 调用时用: #include ifil;col(b)=256 读入ifil,语句内容替代为: n01prefer Product A;c=c256’1’ n01prefer Product B;c=c256’2’ 13.2.2. 编码符号参数 定义编码符号参数 punch(letter)=’code’ 定义编码符号参数 var_name’letter’ 编码符号参数是: cn’a’ ü n是整数 ü a是单个的大写或小写字母 例如:访问每一次到商店购买火腿的商标,同次购买的信息存在同一列中,但不同商标有不同的编码,我们用符号参数’p’,下面语句命名为brds: n10Base n01First Visit;c=c134’p’ n01Second Visit;c=c137’p’ n01Third Visit;c=c140’p’ n01Fourth Visit;c=c143’p’ 调用时用: l brda #include brds; punch(p)=’1’ l brdb #include brds;punch(p)=’2’ 13.2.3. 给符号参数设置全局值 #def [col(letter1)=number1] [;punch(letter2)=’code’] [;name=text] number1是范围在00-99之间的两位有效数字 #def格式为: #def [col(a)=cc][;punch(b)=’p’][;txt=text] ü col,punch,txt是根据要定义值的可选项 ü a,b是要定义值的参数 ü cc是一个列号 ü p是一个编码 ü text是一个文本 例如:定义一个列号适用于一组include文件: #def col(a)=157 定义一个编码适用于一组include文件: #def punch(b)=’2’ 因篇幅问题不能全部显示,请点此查看更多更全内容