当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 11 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : easy-account 终端版本
帖子发表于 : 2009-04-10 11:36 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
代码:
2009-04-10 11:35:46 五 ~/应用/脚本 
☎ cat ea.pl
#!/usr/bin/perl

use Term::Screen;

$scr = new Term::Screen;
unless ($scr) { die "无法产生屏幕。\n"; }
$black="\e[30m"; $red="\e[31m"; $green="\e[32m"; $yellow="\e[33m";
$blue="\e[34m"; $pink="\e[35m"; $cyan="\e[36m"; $white="\e[37m";
$normal="\e[0m"; $bold="\e[1m"; $reverse="\e[7m";

$scr->clrscr();$scr->noecho();
$scr->resize(80,30);
print "\t\t${reverse} easy-account 终端版本${normal}";
use POSIX qw(strftime);
use Switch;
use Date::Parse;

$path="$ENV{HOME}/";
#$path="$ENV{HOME}/project/easy-account/";
$f1="${path}items";
open(ITEMS,$f1) or die("不能打开items文件。\n");
@items=<ITEMS>;
close(ITEMS);

$f1="${path}record";
if(-f $f1){
open(REC,$f1) or die("不能打开record文件。\n");
while(<REC>){
        next if ! /^===/;
        s/^=*//g;
        $lday=s2t($_);
}
close(REC);
}
else {$lday=0;}

$day=time; $opday=$day;
#$lday=$day;
$scr->at(1,0)->clreol()->puts("${red}今天:    ${blue}".t2s($day)."${normal}\n\r");
$scr->at(3,0)->clreol()->puts("${red}最后记录:${blue}".t2s($lday)." ${yellow}<".diffd($lday).">${normal}");
dispdate();

# ---------------------------------------------------------------
MAIN:   while(1){
$in="";$item="";$def="";$price="";@Aitem[0..10];@Adef[0..10];$s=0;
# 0 无输入。1 输入了缩写,可输入数字选择。 2 选择了项目,只能输入数据。
disp();

while(1){
$ch=$scr->getch();
switch($ch){
case [a..z]     {if($s>1){last};$s=1;$in.=$ch;}
case [0..9]     {if($s==0){last};
#case /\d/      {if($s==0){last};
                if($s==1){      # 选择
                if($ch eq "0"){$ch="10";}
                if($ch<=$n){
                $item=$Aitem[$ch];$def=$Adef[$ch];$s=2;
                $scr->at(4,18)->clreol()->puts("选择了 $item");
                }}
                else{   # 输入数据 s=2
                $price.=$ch;
                }}
case "."        {if($s<2){last;}
                if($price eq ""||$price=~/\./){last;}
                $price.=".";}
case "\x0d"     {if($s<2){last;}
                if($price eq "" && $def){$price=$def;}  # 无价格,有默认
                if($price eq ""){last;} # 无价格
                $f1=">>${path}record";
                open(REC,$f1) or die("不能打开record文件。\n");
                if(t2s($opday) ne t2s($lday)){
                $lday=$opday;
                # 输出记录到文件
$scr->at(20,4)->clreol()->puts("记录时间:======".t2s($opday));
$scr->at(3,0)->clreol()->puts("${red}最后记录:${blue}".t2s($lday)." ${yellow}<".diffd($lday).">${normal}");
                print REC "========".t2s($opday)."\n";
                }
        $scr->at(21,4)->clreol()->puts("输入记录:-$item- 金额:-$price-");
                print REC "$item,$price\n";
                close(REC);
                sleep 1;
                next MAIN;}
case "\x7f"     {if($s==0){last;}       #backspace
                if($s==1){chop($in);}
                if($s==2){if($price){chop($price);}
                else{$s=1;chop($in);$item="";$def="";}
                }
                if($in eq ""){next MAIN;}
                }
case "ku"       {$opday=$opday-86400*7;dispdate();}
case "kd"       {$opday=$opday+86400*7;dispdate();}
case "kl"       {$opday=$opday-86400;dispdate();}
case "kr"       {$opday=$opday+86400;dispdate();}
case "\x1b"     {$scr->clrscr();last MAIN;}
else            {       # 显示无效按键
                $scr->at(6,0)->clreol();
                print "输入按键:=$ch=";
                $ch=~s/(.)/"%".unpack('H2',$1)/seg;
                print $ch;
                }
}
disp();
}}
# ---------------------------------------------------------------
sub dispdate {
$scr->at(2,0)->clreol()->puts("${red}操作日期:${blue}".t2s($opday)." ${yellow}<".diffd($opday).">${normal} <-使用光标键修改,增减日/周。\n\r");
}
# ---------------------------------------------------------------
sub disp {
        $scr->at(4,0)->clreol()->puts("操作状态:$s");
        $scr->at(10,0)->clreos();
        switch($s){
        case 2  {
                print "${blue}已选定项目:${red}$item${blue} ";
                if($def){print "默认:${red}$def ${normal} <-可不输入数据,直接回车确定。";}
        $scr->at(8,0)->clreol()->puts("${blue}输入金额:${red}${price}${normal}");
                }
        case 1  {
                print "${green}可选项目:${normal}";
                $n=0;
                foreach(@items){
                chomp;
                ($w,$i,$d)=split(",");
                if($w=~/$in/){
                        $n++;
                        if($n<11){print "${green}$n${normal}:";
                        $Aitem[$n]=$i;$Adef[$n]=$d;}
                        else {print "$n:";}
                        print "$i";
                        if($d){print "(默认:$d)";}
                        print "  ";
                        }
                }
                if($n==1){$scr->stuff_input("1");}
        $scr->at(8,0)->clreol()->puts("${blue}输入名称缩写:${normal}$in");
                }
        case 0  {
        $scr->at(8,0)->clreol()->puts("${blue}输入名称缩写:${normal}");
                }

        }
}
# ---------------------------------------------------------------
sub t2s {
        my $t=shift;
        return strftime("%Y-%m-%d %A",localtime($t));
}
# ---------------------------------------------------------------
sub s2t {
        my $t=shift;
        ($t,undef)=split(" ",$t);
        return str2time($t);
}
# ---------------------------------------------------------------
sub diffd {
        my $d=int(($day-shift)/86400);
        if($d==0){return "今天";}
        if($d==1){return "昨天";}
        if($d==2){return "前天";}
        if($d>2){return "$d 天前";}
        if($d==-1){return "明天";}
        if($d==-2){return "后天";}
        $d=~s/^-//;
        return "$d 天后";
}
# ---------------------------------------------------------------


_________________
● 鸣学


页首
 用户资料  
 
2 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2009-09-21 17:23 
头像

注册: 2007-06-13 15:57
帖子: 12564
地址: 在他乡
送出感谢: 50
接收感谢: 87
EE,这是你的“小型财务软件”吗? :em05
回头我看看我会用不 :em09


页首
 用户资料  
 
3 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2009-09-21 17:51 
头像

注册: 2007-06-13 15:57
帖子: 12564
地址: 在他乡
送出感谢: 50
接收感谢: 87
引用:
~$ ./a.pl
Can't locate Term/Screen.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at ./a.pl line 3.
BEGIN failed--compilation aborted at ./a.pl line 3.
啥意思,不让我用? :em20


页首
 用户资料  
 
4 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2009-09-21 20:04 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
sudo cpan Term::Screen
不就安装了。


附件:
screenshot-2009-09-21-20-10-54.jpg
screenshot-2009-09-21-20-10-54.jpg [ 30.42 KiB | 被浏览 803 次 ]



_________________
● 鸣学
页首
 用户资料  
 
5 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2010-07-01 12:12 
头像

注册: 2008-12-09 12:44
帖子: 3864
地址: 北京
送出感谢: 0 次
接收感谢: 2
取之!


_________________
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接


页首
 用户资料  
 
6 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2010-07-13 15:06 

注册: 2008-10-31 22:12
帖子: 6546
系统: 践兔
送出感谢: 18
接收感谢: 25
楼上挖坟!

10个月了 :em05 :em04 :em04

eexpress:
很好,能用。 :em05 :em04 :em04
ps:
代码:
$scr = new Term::Screen;
unless ($scr) { die "无法产生屏幕。\n"; }

搞成一行吧。


_________________
代码:
] ls -ld //


页首
 用户资料  
 
7 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2010-07-13 15:18 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
额。你自己改吧。
能用就好。


_________________
● 鸣学


页首
 用户资料  
 
8 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2010-07-13 15:30 
头像

注册: 2008-11-21 20:26
帖子: 36913
送出感谢: 1
接收感谢: 36
又是perl,我要python的


_________________
讨厌我的人可以试着点一下
浏览全部ubuntu技巧


页首
 用户资料  
 
9 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2010-08-04 13:46 
头像

注册: 2008-12-09 12:44
帖子: 3864
地址: 北京
送出感谢: 0 次
接收感谢: 2
其实我这一直报错,还没等研究呢,斗篷男告诉我youmoney没问题,还是继续用youmoney了……


_________________
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接


页首
 用户资料  
 
10 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2010-09-11 18:38 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
代码:
☛ cat ea.sqlite3.pl
#!/usr/bin/perl

use Term::Screen;

$scr = new Term::Screen;
unless ($scr) { die "无法产生屏幕。\n"; }
$black="\e[30m"; $red="\e[31m"; $green="\e[32m"; $yellow="\e[33m";
$blue="\e[34m"; $pink="\e[35m"; $cyan="\e[36m"; $white="\e[37m";
$normal="\e[0m"; $bold="\e[1m"; $reverse="\e[7m";
$b_black="\e[40m"; $b_red="\e[41m"; $b_green="\e[42m"; $b_yellow="\e[43m";
$b_blue="\e[44m"; $b_pink="\e[45m"; $b_cyan="\e[46m"; $b_white="\e[47m";

$scr->clrscr();$scr->noecho();
$scr->resize(80,30);
print "\t\t${reverse} easy-account sqlite3 终端版本${normal}";
use POSIX qw(strftime);
use Switch;
use Date::Parse;

use File::Basename qw/basename dirname/;
$path=$0;
$path=readlink $0 if -l $0;
#$f1=basename $path; $f1=~s/\..*?$//;
$f1="ea.sqlite3";
$path=dirname $path;
chdir $path;

@items=`sqlite3 $f1 "select * from ind;"`;

$day=time; $opday=$day;
$scr->at(1,0)->clreol()->puts("${red}今天:    ${blue}".t2s($day)."${normal}\n\r");
dispdate();

# ---------------------------------------------------------------
MAIN:   while(1){
$in="";$item="";$def="";$price="";@Aitem[0..10];@Adef[0..10];$s=0;
# 0 无输入。1 输入了缩写,可输入数字选择。 2 选择了项目,只能输入数据。
disp();

while(1){
$ch=$scr->getch();
switch($ch){
case [a..z]     {if($s>1){last};$s=1;$in.=$ch;}
case [0..9]     {if($s==0){last};
#case /\d/      {if($s==0){last};
                if($s==1){      # 选择
                if($ch eq "0"){$ch="10";}
                if($ch<=$n){
                $item=$Aitem[$ch];$def=$Adef[$ch];$s=2;
                $scr->at(4,18)->clreol()->puts("选择了 $item");
                }}
                else{   # 输入数据 s=2
                $price.=$ch;
                }}
case "."        {if($s<2){last;}
                if($price eq ""||$price=~/\./){last;}
                $price.=".";}
case "\x0d"     {if($s<2){last;}
                if($price eq "" && $def){$price=$def;}  # 无价格,有默认
                if($price eq ""){last;} # 无价格

                # 输出记录到文件
                $_=t2s($opday); s/\ .*//; my $date=$_;
                $cmd="sqlite3 $f1 \"insert into rec values('$date','$item',$price, NULL)\";";
                `$cmd`;
                $scr->at(25,0)->clreol()->puts("==========================================");
                $scr->at(26,4)->clreol()->puts("记录时间:======".$date);
                $scr->at(27,4)->clreol()->puts("输入记录:-$item- 金额:-$price-");
#----------------------------
#                sleep 1;
                next MAIN;}
case "\x7f"     {if($s==0){last;}       #backspace
                if($s==1){chop($in);}
                if($s==2){if($price){chop($price);}
                else{$s=1;chop($in);$item="";$def="";}
                }
                if($in eq ""){next MAIN;}
                }
# 4个光标按键
case "ku"       {$opday=$opday-86400*7;dispdate();}
case "kd"       {$opday=$opday+86400*7;dispdate();}
case "kl"       {$opday=$opday-86400;dispdate();}
case "kr"       {$opday=$opday+86400;dispdate();}
case "\x1b"     {$scr->clrscr();last MAIN;}
else            {       # 显示无效按键
                $scr->at(6,0)->clreol();
                print "输入按键:=$ch=";
                $ch=~s/(.)/"%".unpack('H2',$1)/seg;
                print $ch;
                }
}
disp();
}}
# ---------------------------------------------------------------
sub dispdate {
my $d=t2s($opday);$d=~/\S*/; my $dd=$&;
$scr->at(2,0)->clreol()->puts("${red}操作日期:${blue}".$d." ${yellow}<".diffd($opday).">${normal} <-使用光标键修改,增减日/周。");

my $spos=15;
$scr->at($spos,0)->clreol()->puts($blue."当天记录(前9条):".$normal);
$scr->at($spos+1,0)->clreos();
@_=`sqlite3 ea.sqlite3 "select * from rec where date like '$dd%' limit 9;"`;
$i=1;
for(@_){
$scr->at($spos+$i,0)->clreol()->puts($i." - ".$_);
$i++;
}
}
# ---------------------------------------------------------------
sub disp {
        $scr->at(4,0)->clreol()->puts("操作状态:$s");
#        $scr->at(10,0)->clreos();
        $scr->at(10,0)->clreol();
        $scr->at(11,0)->clreol();
        $scr->at(12,0)->clreol();
        $scr->at(13,0)->clreol();
        $scr->at(14,0)->clreol();
        $scr->at(9,0)->clreol();
        switch($s){
        case 2  {
                print "${blue}已选定项目:${bold}${yellow}${b_blue}$item${normal}${blue} ";
                if($def){print "默认:${red}$def ${normal} <-可不输入数据,直接回车确定。";}
        $scr->at(8,0)->clreol()->puts("${blue}输入金额:${red}${price}${normal}");
                }
        case 1  {
                print "${green}可选项目:${normal}";
                $n=0;
                foreach(@items){
                chomp;
                ($w,$i,$d)=split("\\|");
                if($w=~/$in/){
                        $n++;
                        if($n<11){print "${green}$n${normal}:";
                        $Aitem[$n]=$i;$Adef[$n]=$d;}
                        else {print "$n:";}
                        print "$i";
                        if($d){print "(默认:$d)";}
                        print "  ";
                        }
                }
                if($n==1){$scr->stuff_input("1");}
        $scr->at(8,0)->clreol()->puts("${blue}输入名称缩写:${normal}$in");
                }
        case 0  {
        $scr->at(8,0)->clreol()->puts("${blue}输入名称缩写:${normal}");
                }

        }
}
# ---------------------------------------------------------------
sub t2s {
        my $t=shift;
        return strftime("%Y-%m-%d %A",localtime($t));
}
# ---------------------------------------------------------------
sub s2t {
        my $t=shift;
        ($t,undef)=split(" ",$t);
        return str2time($t);
}
# ---------------------------------------------------------------
sub diffd {
        my $d=int(($day-shift)/86400);
        if($d==0){return "今天";}
        if($d==1){return "昨天";}
        if($d==2){return "前天";}
        if($d>2){return "$d 天前";}
        if($d==-1){return "明天";}
        if($d==-2){return "后天";}
        $d=~s/^-//;
        return "$d 天后";
}
# ---------------------------------------------------------------

原格式转csv的。

代码:
☛ cat rec2csv.pl
#!/usr/bin/perl

while (<>){
chomp;
if (/^==/){
/20..-..-../;$date=$&;
next;
}
$_="$date,$_";
if(/,[\d.]*$/){$_.=",";}
print "$_\n";
}

转换
代码:
☛ cat record|./rec2csv.pl >2010.csv

代码:
☛ cat 2008记录|./rec2csv.pl >2008.csv

导入
代码:
sqlite> .mode csv
sqlite> .import ./2008.csv rec
sqlite> .import ./items-csv ind      --items-csv用vim编辑添加行尾的逗号(非数字结束的行),:%s/\([^0-9]\$)/\1,/g


_________________
● 鸣学


页首
 用户资料  
 
11 楼 
 文章标题 : Re: easy-account 终端版本
帖子发表于 : 2010-09-11 18:43 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
建立数据库的过程。

引用:
☛ sqlite3 ea.sqlite3 ".dump" > output.sql


引用:
☛ g -v insert output.sql
1:PRAGMA foreign_keys=OFF;
2:BEGIN TRANSACTION;
3:CREATE TABLE rec(date,item,cost,note);
4452:CREATE TABLE ind(short,item,cost0);
4548:COMMIT;


代码:
☛ sqlite3 ea.sqlite3 < output.sql


_________________
● 鸣学


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 11 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译