;;;in2out.scm
;;读取整个文件,每行为一项,返回列表。
(define (read-block iport)
(do ((data '() (read-line iport))
(return '() (append return (list data)))
)
((eof-object? data) (cdr return))
)
)
;;写文件,每个子项为一行
(define (write-block data port)
(do ((data data (cdr data))
(return '() (if (null? data)
'()
(write-line (car data) port)
)
)
)
((null? data) return)
)
)
;;去掉整个列表的标签
(define (block-drop-flag data)
(do ((data data (cdr data))
(result '() (append result (list (drop-flag (car data)))))
)
((null? data) result)
)
)
;;扫描整个列表,标出每个类型数据的开始位置的索引,返回eg:(0 4 8 23 ...)
;;这功能可能用不上
(define (scan-block data)
(do ((data data (cdr data))
(index 0 (+ index 1))
(flag #t (if (string=? (get-flag (car data)) (get-flag (car (cdr data))))
#t
#f
)
)
(return '() (if (not flag)
(append return (list index))
return
)
)
)
((null? (cdr data)) (append return (list (+ index 1))))
)
)
;;计算出每个字列的最大最小 生成一个新列表
(define (class-min-max data)
(do ((data data (cdr data))
(return '() (append return (list (get-min-max2 (car data)))))
)
((null? data) return)
)
)
;;按标致分组给定列表
(define (div-block data)
(do ((data data (cdr data))
(flag #t (if (string=? (get-flag (car data)) (get-flag (car (cdr data))))
#t
#f
)
)
(return '() (if flag
(append return (list (drop-flag (car data))))
(append '() (list (drop-flag (car data))))
)
)
(return2 '() (if flag
return2
(append return2 (list return))
)
)
)
((null? (cdr data)) (append return2 (list (append return (list (drop-flag (car data)))))))
)
)
;;取列表中的最小值和最大值,返回min/max格式的字符串
(define (get-min-max data)
(do ((data data (cdr data))
(maxa "" (cond ((string>? maxa (car data)) maxa)
((string>? (car data) maxa) (car data))
(else maxa)
)
)
(mina "" (cond ((string<? mina (car data)) mina)
((string<? (car data) mina) (car data))
(else mina)
)
)
);这里是结构体
;下面是结束条件
((null? data) (string-append mina "/" maxa))
)
)
(define (get-min-max2 data)
(define (iter xdata)
(string-append (first xdata) "/" (list-ref xdata (- (length xdata) 1)))
)
(iter (sort data string<?))
)
;;返回去掉标签后的字符串,E1,20100909 => 20100909
(define (drop-flag str)
(substring str (+ 1 (string-search-forward "," str)) (string-length str))
)
;;获取给定字符串的标签,E1,20100909 => E1
(define (get-flag str)
(substring str 0 (string-search-forward "," str))
)
;;main
(define (in2out inport outport)
(write-block (class-min-max (div-block (read-block inport)))
outport
)
)
;;;;;------Main---------------------------------------------------
(define inport (open-input-file "D:\\Workroom\\wkroom\\in2out\\in.csv"))
(define outport (open-output-file "D:\\Workroom\\wkroom\\in2out\\out.csv"))
(newline)
(define a (read-block inport))
(define b (div-block a))
(define d (class-min-max b))
(display (get-min-max2 '("20100909" "20100909")))
(write-block d outport)
(newline)
(close-all-open-files)
------------------------------运行方法---------------------------------------
start "" "D:\MIT-GNU Scheme\bin\mit-scheme.exe" --heap 5000 --library "D:\MIT-GNU Scheme\lib" --load in2out.scm
-------------------------in.csv文件内容如下:部分不完整-------------------------------------------
E1,20100909
E1,20110907
E1,20101021
E1,20101207
E2,20110513
E2,20101014
E2,20100918
E2,20100905
E3,20101230
E3,20101220
E3,20110310
E3,20110109
E3,20110301
E3,20110505
E3,20110427
E3,20110422
E3,20111214
E3,20111217
E3,20111108
E3,20131018
E3,20131004
E3,20130428
E3,20130417
E4,20101123
E4,20110802
E4,20120305
E4,20120312
E5,20110401
E5,20110711
E5,20111220
E6,20120327
E6,20120330
E6,20120515
E6,20120910
E7,20101231
E7,20101229
E7,20111129
E7,20120228
E7,20111205
E7,20111228
E8,20110623
E8,20110630
E8,20101231
E8,20110630
E9,20110622
E9,20110623
E9,20110220
E9,20110630
E10,20110506
E10,20110530
E11,20101231
E11,20110630
E12,20110529
E12,20110630
E13,20110630
E13,20110210
E14,20101201
E14,20110630
E14,20110226
E14,20110630
E15,20110223
E15,20111120
E15,20110226
E15,20110226
E16,20110721
E16,20110829
-------------------------运行程序后输出out.csv----------------------------
"20100909/20110907"
"20100905/20110513"
"20101220/20131018"
"20101123/20120312"
"20110401/20111220"
"20120327/20120910"
"20101229/20120228"
"20101231/20110630"
"20110220/20110630"
"20110506/20110530"
"20101231/20110630"
"20110529/20110630"
"20110210/20110630"
"20101201/20110630"
"20110223/20111120"
"20110721/20110829"
"20110413/20110721"
"20111120/20130812"
"20101201/20101201"
"20110218/20110609"
"20101130/20110501"
"20111207/20120726"
"20111120/20130908"
"20101201/20101201"
"20110917/20130523"
"20101229/20101229"
"20111120/20130523"
"20110116/20110116"
"20110917/20130908"
"20110529/20111120"
"20130903/20130903"
"20110111/20110111"
"20110917/20130801"
"20120401/20130802"
"20130926/20130926"
"20111030/20111030"
"20130506/20131111"
"20110912/20110912"
"20101129/20130509"
"20110912/20110912"
"20101123/20111120"
"20111031/20120906"
"20110705/20110705"
"20110705/20110705"
"20110702/20110702"
"20110702/20110702"
"20110703/20110703"
"20110703/20110703"
"20110703/20110703"
"20110703/20110703"
"20110705/20110705"
"20110705/20110705"
"20110719/20110719"
"20110705/20110705"
"20110719/20110719"
"20110719/20110719"
"20110719/20110719"
"20110719/20110719"
"20110719/20110719"
"20110719/20110719"
"20110718/20110718"
"20110719/20110719"
"20101102/20101122"
"20110718/20110718"
"20110718/20110718"
"20111031/20111031"
"20111031/20111031"
"20111221/20111221"
"20121008/20121008"
"20120527/20120527"
"20120717/20120717"
"20120730/20120730"
"20120926/20120926"
"20130328/20130328"
"20110222/20110914"
"20110218/20110913"
"20110218/20110909"
"20110727/20130322"
"20110219/20110909"
"20111130/20111130"
"20111130/20111130"
"20130427/20130427"
"20130427/20130427"
"20110222/20110909"
"20110228/20110913"
"20110503/20111203"
"20130726/20130726"
"20110223/20110908"
"20110118/20110908"
"20110913/20110913"
"20110909/20110909"
"20110909/20110909"
"20110908/20110908"
"20111217/20120830"
"20121127/20121127"
"20111205/20120327"
"20110919/20110919"
"20120129/20120401"
"20111205/20111205"
"20120129/20120129"
"20110908/20120326"
"20120129/20120401"
"20140106/20140412"
"20131220/20140304"
"20131007/20140124"
"20140112/20140225"
"20140202/20140202"
"20100903/20110815"
"20101029/20130616"
"20100910/20110901"
"20101101/20130615"
"20110701/20130515"
"20110630/20140221"
"20100915/20121103"
"20101120/20110520"
"20110620/20111221"
"20120220/20121118"
"20121218/20130618"
"20130718/20131218"
"20100929/20101101"
"20111029/20111104"
"20120830/20120925"
"20101205/20110802"
"20101027/20110424"
"20101103/20131106"
"20101023/20121024"
"20101025/20121024"
"20101025/20121024"
"20101020/20120412"
"20101009/20121024"
"20111010/20131016"
"20111009/20131016"
"20110223/20111013"
"20111019/20120106"
"20120107/20120625"
"20101227/20110801"
"20110803/20111016"
"20111018/20111214"
"20111216/20121220"
"20120422/20120612"
"20120613/20130422"
"20101122/20110224"
"20110219/20110525"
"20110525/20110807"
"20110808/20111015"
"20111016/20111213"
"20111214/20120409"
"20120410/20120613"
"20120614/20120813"
"20120814/20121009"
"20121010/20121219"
"20121221/20130602"
"20130420/20130516"