easy-account 终端版本

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

easy-account 终端版本

#1

帖子 eexpress » 2009-04-10 11:36

代码: 全选

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 天后";
}
# ---------------------------------------------------------------
● 鸣学
头像
daf3707
论坛版主
帖子: 12668
注册时间: 2007-06-13 15:57
来自: 在他乡
送出感谢: 49 次
接收感谢: 85 次

Re: easy-account 终端版本

#2

帖子 daf3707 » 2009-09-21 17:23

EE,这是你的“小型财务软件”吗? :em05
回头我看看我会用不 :em09
头像
daf3707
论坛版主
帖子: 12668
注册时间: 2007-06-13 15:57
来自: 在他乡
送出感谢: 49 次
接收感谢: 85 次

Re: easy-account 终端版本

#3

帖子 daf3707 » 2009-09-21 17:51

~$ ./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
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: easy-account 终端版本

#4

帖子 eexpress » 2009-09-21 20:04

sudo cpan Term::Screen
不就安装了。
附件
screenshot-2009-09-21-20-10-54.jpg
● 鸣学
头像
pityonline
帖子: 3864
注册时间: 2008-12-09 12:44
来自: 北京
送出感谢: 0
接收感谢: 2 次
联系:

Re: easy-account 终端版本

#5

帖子 pityonline » 2010-07-01 12:12

取之!
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接
tusooa
帖子: 6546
注册时间: 2008-10-31 22:12
系统: 践兔
送出感谢: 6 次
接收感谢: 10 次
联系:

Re: easy-account 终端版本

#6

帖子 tusooa » 2010-07-13 15:06

楼上挖坟!

10个月了 :em05 :em04 :em04

eexpress:
很好,能用。 :em05 :em04 :em04
ps:

代码: 全选

$scr = new Term::Screen;
unless ($scr) { die "无法产生屏幕。\n"; }
搞成一行吧。

代码: 全选

] ls -ld //
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: easy-account 终端版本

#7

帖子 eexpress » 2010-07-13 15:18

额。你自己改吧。
能用就好。
● 鸣学
头像
tenzu
论坛版主
帖子: 36913
注册时间: 2008-11-21 20:26
送出感谢: 0
接收感谢: 21 次

Re: easy-account 终端版本

#8

帖子 tenzu » 2010-07-13 15:30

又是perl,我要python的
头像
pityonline
帖子: 3864
注册时间: 2008-12-09 12:44
来自: 北京
送出感谢: 0
接收感谢: 2 次
联系:

Re: easy-account 终端版本

#9

帖子 pityonline » 2010-08-04 13:46

其实我这一直报错,还没等研究呢,斗篷男告诉我youmoney没问题,还是继续用youmoney了……
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: easy-account 终端版本

#10

帖子 eexpress » 2010-09-11 18:38

代码: 全选

☛ 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
● 鸣学
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: easy-account 终端版本

#11

帖子 eexpress » 2010-09-11 18:43

建立数据库的过程。
☛ 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
● 鸣学
回复

回到 “Shell脚本”