存档

文章标签 ‘program’

SAS变量输入输出格式控制

2010年7月18日 4 条评论

读朱世武老师的《SAS编程技术教程》,的确是一本不错的书籍,至少很适合我。因为对于我,对SAS算初窥门径,经常在编程的时候忘记一些函数,或者寻找软件的一些功能,这本书恰恰就是如此,作为刚刚入门的书籍并不好,但是作为参考书,很好,至少把很多函数和命令分门别类清晰的表述清楚了。其实国内的书籍都很少能够达到这个层次。这本书相对于SAS帮助文档来说,查阅比较方便,因为sas帮助文档不能搜索,而这本书更体现参考书的价值。

最近要处理大量的日期、和会计(带千位符)的数字,以前处理这类数据都是从excell导入的,操作之后发现,导入的数据有时会出现一些小问题,而且还要用insight一个个的编辑变量,比较麻烦,希望能够通过cards一次性录入。方便以后存储和备份,因为随着SAS应用越来越多,我更倾向于用SAS来创建、管理我的研究数据。为此,我阅读了朱老师关于变量输入与输出格式控制的内容,笔记如下:

    1、输入格式

输入格式是SAS系统用来读入数据值的一个指令。

输入格式形式

<$>  INFORMAT<W>.<D>

选项说明:

$ 字符格式
W 输入数据的列数
D 数值输入格式中保留小数的位数
Informat 用来规定数据的输入格式

通用规则:
所有输入格式必须包含一个点(.)作为名字的一部分;
对于省略W和D值的输入格式,使用系统缺省值。

    2、列格式输入
input @6 date ddmmyy10.  @+1 stocd $ 8.  oppr 8.2;

说明:从第6列开始以DDMMYY10.格式读入变量DATE, 第7列开始以长度为8的字符格式读入变量STOCD,然后以数值格式8.2读入变量OPPR。
查看都安装了那些模块,和一些系统信息。

    3、数值与字符相互转换的方法

字符转换数值

1
2
3
4
5
data;
x='98.6';
y=input(x, 4.);
put x= y=;
run;

说明:INPUT函数和w.d输入格式将X的字符值转换为一个数值Y。还有一个更简单的,将字符值转换为数值的方法。

1
2
3
4
5
data;
x='98.6';
y=x-0;
put x= y=;
run;

数值转换为字符

1
2
3
4
5
data;
x=2557898;
y=put(x, $8.);
put y;
run;

例中,用PUT函数得到正确结果,即字符型2557898.

1
2
3
4
5
data;
x=2557898;
y=put(x, $3.);
put y;
run;

例中,Y的结果为3E6.

4、读入会计格式字符
读入类似11,222.11格式的字符。

1
2
3
4
5
6
7
8
data a;
input x;
informat x comma12.4;
cards;
12,345.1234
22,345.1234
;
run;

当然,你可以按照下表,更换不同的输入格式以读入不同格式的数据。

其中,COMMAw.d 用于输入格式读入包含字符的数值,这些字符包括: 逗号、空格、 $、%、破折号、圆括号等。
5、输入输出日期
SAS系统存贮日期值为1960年1月1日到这个日期之间的天数。

1
2
3
4
5
6
7
data a;
input date mmddyy10.;
cards;
10-01-2002
10/01/2002
;
run;

此时,日期中存储的是天数,当使用insight等的时候,不直观,所以一般用下面的程序录入数据。

1
2
3
4
5
6
7
8
data a;
input date mmddyy10.;
format date yymmdd10.;
cards;
10-01-2002
10/01/2002
;
run;

当然,你还可以根据下表,输入不同格式的日期数据。

此时,存储的虽然仍然是天数,但是是根据您的要求显示了。还可以根据下面的表,设置具体的显示形式。

    5、PUT函数

PUT函数可将数值转换为字符(如前所述),但最常用的是改变变量的字符输出格式。
例1: 转换数值变量cc的值为三个字符的十六进制表达式。

1
2
3
4
5
data;
cc=16;
cchex=put(cc,hex3.);
put cc hex3.;
run;

结果为010.
例2: 将数值CC转换为字符值。

1
2
3
4
data;
cc=16;
cc=put(cc,3.);
run;

例3: 输出时美元符号放在数值前面,中间加上千分号。

1
2
3
4
data;
Netpay=1254.71;
put @53 netpay  dollar10.2;
run;

输出值为$1,254.71.

字符变量的输出格式可以查阅下表。

再一次感谢朱世武老师的总结。

分类: 数据可视化 标签: , ,

售后培训页面的建立方法

2010年7月5日 2 条评论

讲课,不可避免的学生向你要ppt和各种资料,用U盘copy?病毒很危险,怎么办呢?这个东西又不能随意分发。最近新学了php,讲课的时候灵光一闪,想到了解决思路。

建立一个页面,学院输入姓名后转到下载页面,然后再用文件记录到访日志,学员姓名用遍历数组的方法确认。这个主意导致我讲课突然中断,和各位学员面面相觑。

最近我总有这样的毛病,正讲课呢,脑子里就突然出现了另外一件事情的解决办法,大概因为这节课讲的东西我太过熟悉了吧。

言归正传,说说这个培训售后服务是如何写好的,这也算是我学习php的一个学习作品吧。您可以先到www.wangyutang.com/sh/体验下先。
首先,建立登陆界面,很简单,就是一个带form的php文档,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<html>
<title>王玉堂培训售后服务网</title>
<body>
<center>
  <h1>王玉堂培训"售后服务网"</h1>
  <p>
  	<h3>输入姓名后,就可以下载教师在课堂上的所有课件及资料</h3>
  	<br>姓名必须和通讯录上的一致方可下载<br>
  <form action="sh.php" method="post">
   <table>
      <tr>
       <td>学员姓名</td>
      <td><input type="text" name="name"></td>
     </tr>
      <tr>
       <td><input type="submit" value="登陆"></td>
       <td><input type="reset" value="重置"></td>
      </tr>
    </table>
   </form>
 
</center>
 
<p>
<center>Copyright &copy Wang Yutang 2007, 2008, 2009, 2010<center>
</body>

登陆后的post的提交页面叫做sh.php,这个页面首先用数组存入学员的姓名,然后使用for循环遍历数组,当提交的学院姓名与数组中的某个学员姓名一致的时候,给出下载地址,并打开日志文件aa.txt讲登陆的学员姓名记录下来。下载地址本来计划使用header跳转的,可最近没时间研究。以后再说。如果数组遍历后,没有一致的学员姓名,则给出提示。这个本来用一个if语句来写,但是我觉得if语句太长了怕以后看不懂,就在一致的时候给一个变量赋值,然后再判断这个变量是否得到了该值,没有得到,则给出出错提示。
看代码,我已经给出了详细的解释。我之所以没用数据库,是因为用到数据库更为麻烦,还不如如此。我之所以用for循环来进行数组遍历,只是我习惯用for循环,不晓得和foreach之间的效率差别,这不是我考虑的问题了,我只是要实现我的目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php  
$name = $_POST["name"];
define("GREETING","很高兴与您共同度过5天时间,祝您工作顺利,万事如意,有事情可以随时拨打售后电话或者发送email。地址是:");
define("email","king@gmail.com");
define("mobilephone","137XXXXXXXX");
//访问日志,访问文件是1log.txt,2log.txt是输入错误学员姓名的记录。
$filename = '1log.txt';
$filenameall = '2log.txt';
//2010.6.26日班名单,共计19人。
$a = array("张三","李四");
$num = count($a);
if ($name)
{ 
for ($i=0;$i<$num;$i++)
{
    if ($a[$i]==$name)
   {
?>
<center>
	<center><h1>中国XXXX<br>国家XXX<br>XXXX售后服务网</h1><br>2010年6月26日-2010年6月30日</center>
<?php
      echo "<h1>" . "欢迎:" . $name . "</h1" . "<p>";
	    echo "<center>" . constant("GREETING") . "<p>" . constant("email") . "<br>" . constant("mobilephone") . "</center>";
	    echo "下载地址“
	   //用判断是否输入正确学员姓名,
              $good = "1";
	 //写入日志文件,查看都谁下载了课件。   
	if (is_writable($filename)) {
 
    if (!$handle = fopen($filename, 'a')) {
         //echo "无法打开日志文件 ($filename)";
         exit;
    }
 
    // Write $somecontent to our opened file.
    if (fwrite($handle, "$name\n") === FALSE) {
        //echo "无法写入日志 ($filename)";
        exit;
    }
 
    //echo "成功将 ($name) 写入日志文件 ($filename)";
 
    fclose($handle);
   exit;
	} else {
    exit;
    //echo "无法记录到日志文件: $filename ,日志文件不可写!";
	}
?>
</center>
<?php	 }
}
}
 
if ($good <> "1")
{
	echo "您输入了错误的姓名,或者您并非我班学员!";
	echo "<a href=\"index.htm\">重新登录</a>";
	echo "<br>";
// 把输入错误的也记录到日志文件。
	if (is_writable($filenameall)) {
    if (!$handle = fopen($filenameall, 'a')) {
         echo "无法打开日志文件 ($filenameall)";
         exit;
    }
 
    // Write $somecontent to our opened file.
    if (fwrite($handle, "$name\n") === FALSE) {
        echo "无法写入日志 ($filenameall)";
        exit;
    }
    echo "成功将 ($name) 写入日志文件 ($filenameall)";
 
    fclose($handle);
   exit;
	} else { 
    exit;
    echo "无法记录到日志文件: $filename ,日志文件不可写!";   
	}
}
 
include("footer.php");    	
 
?>

简单吧,php真的很简单,至少上手比较容易。以后会改正下载方式,隐藏下载地址。这个程序总计花了我5个多小时的时间。前期调试wamp半天,后来调试cookie半天,本来想让用户反复登录,判断用户是否登录,如登录自动跳转,没太弄明白,而且要把登录页面也改成php的,为了节省时间,就没弄。以后把第二个培训班的名单也登陆上。

在记录趣事一件。前几天看荷兰和巴西的比赛,这是我世界杯开赛以来我看的第一场足球赛,虽然我是个十足的伪球迷,而且最近忙的一直很累,但是还是贪心的想看一场完整的世界杯比赛。这场球看得精彩,开场十分钟,巴西就用一个精准的直塞搞定荷兰一个球,我想,我不太相信荷兰不进球,罗比的脚法我还是蛮信任的,就这样看到半场打平,半场后我就有点迷迷糊糊,后来听见欢呼声又进了一个球,此时我已睡意沉沉,不知觉间进了梦乡,待我凌晨3点醒来,揉揉眼睛,奇迹出现了,场上居然变成了0:0,我当时的感觉那真是千头万绪,看了半天我没整明白这到底是怎么回事,难道不算了?这个世界好神奇,呵呵,当我有这种想法的时候,我看到了屏幕右上角的时间,又看到了对阵双方,我才想起来,都第二场了。呵呵。当时我真是懵(这个词我念了N年的糟了)了,想起我们神奇的国度,以为南非也和谐了。呵呵。现在想起来我都得儿呵呵笑一笑。

分类: IT技术 标签: ,

python及web开发框架不适合编程初学者

2010年4月18日 2 条评论

听了一个报告后,我就一直想做一个食品感官评价网站,周末就是我处理这些残思杂念的时候。我对于编程完全是门外汉,可前端时间无意之间看了一些python的资料,也大致看了python的语法,觉得的确很简单,加上其快捷的开发,我一直跃跃欲试的想学习这个,自己独立用python做一个站点,在网站结构设计完成后,这个周一,虽然还有别的工作,也禁不住诱惑,详细了解了一下python以及一些web开发的框架。

就像python吸引我的原因是快捷一样,我也想找一个最简单的webframe,这样一点学习一边实践,大约就可以把网站做出来了。首先,我比较了一下一些流行的web框架。以下就是我从自己的初学者的特点,对几种框架中对于初学者,我来说,最难理解的部分。

    Django

在中文社区,Django是最火的一个框架。我看了Django step by step和网上的一些资料,花了一上午的时间学习django,发现他的优势也是他的劣势。
首先是比如url处理,他都综合在url.py里面,那些繁琐的正则表达式的确不是普通的初学者容易掌握的。比如像下面的文件:

urlpatterns = patterns(”,
(r’^admin/’, include(‘django.contrib.admin.urls.admin’)),

(r’^jobs/$’, ‘djproject.jobs.views.index’),
(r’^jobs/(?P\d+)/$’, ‘djproject.jobs.views.detail’),
)

前面用这则表达式确定传入变量,从而决定响应,对于编程初学者来说,的确不适合。而且,要根据项目的变化,随时import各种模块,对于刚刚学习编程的人来说,的确不适合。

另外,Django 里面同样难以理解的是调用模板时变量的传递,render,HttpResponseRedirect 还是 redirect都让我难以理解模板的参数是如何传递进去的。

最后,就是django的版本问题,大概所有开源软件都有这个毛病,版本过多,导致一些语法、属性的修改,让人无所适从。

    karrigell

同样本着快捷的思路,找到了同样获得很多赞美之词的karrigell ,这个用了比django更少的时间研究,但是问题于django类似,只是karrigell 处理url的方式比django更友好一些,但是仍然有很多问题。

为此,我回头又重新了了一下python的文档,这次我看的是英文的,因为我发现经过中文翻译后,有很多语句难以理解(大概不是人家翻译的问题),同样看了一下午,我发现,如果你想学会开发web网站的语言,对于初学者而言,绝对不该学习python,抛开中文资料贫乏,很多文章大同小异不说,python属于那些基础语言的顶端,它的很多优势,来源于创造者对原来高级语言的改进,而如果不彻底理解像C一样的语言,很难理解python语法结构。所以,从某种程度上来讲,python的确不适合编程的初学者。网络上那些对python的赞美之词,绝大多数来自那些有经验的程序员,这恰恰太高了编程初学者的门槛。

但是,无可厚非,从语法的简洁程度上来说,python是我不用看文档就能够大致了解的语言,但仅限于此,你很难真正的利用python做点什么。比如当我要实现一个程序的时候,我总习惯的用vb的方式实现,而这种方式根本不适合python。

所以,我说,python不适合编程的初学者。python只是看上去很美。

以下我是这个周么学习python的django框架的一些总结:
运行django自带的服务器的命令:

python manage.py runserver

这个命令要在你建立好的项目下运行,建立项目和app的命令如下:

django-admin.py startproject your_project’s name

建立app:

python manage.py startapp your_app’s name

django 安装完成后,和安装python后一样,最好将目录加入到path路径中,dango的路径是

site-packages/django/bin

调用你建立项目下的python shell:

python manage.py shell

当做好数据连接的准备工作后,要运行上述命令,然后运行下面的命令验证配置是否ok。

>>> from django.db import connnection
>>> cursor = connection.cursor()

运行后没有出错提示,证明配置正确。
建立好modeles后,要运行如下命令:

python manage.py validate

验证配置的正确与否。
正确后,运行
python manage.py sqlall app’s name
,把CREATE TABLE语句显示到屏幕上,用
python manage.py syncdb
,把你的模型同步到数据库 。

分类: IT技术 标签: ,