Cass面积数据文件转换
一、起因
在工程测量中,Cass软件导出的数据一般非常多(几百上千个单元行),不便于人读取(特别是要求提供计算依据时)。为了能够将数据交与电子表格处理,更需要对其进一步格式化,而大量的数据意味着超巨大的人工操作。
二、设计目标
导出的每单元数据格式如下:
编号: 1
点1:80619.389,41157.754,259.600
点2:80619.065,41158.896,259.661
点3:80622.015,41159.021,259.422
12边长:1.189 13边长:2.921 23边长:2.962
表面积: 1.711
考虑用计算机自动处理并格式化各单元数据,使其每个单元均形成一行以“,”分隔的数据单元,以便直接导入电子表格。
这里采用Racket来完成该项工作。
三、实现思路
将文件按单元分块,递归进行处理。
每个单元又按“编号”、“点”、“边长”、“表面积”进行分别处理。
这里用到的主要是字符串的切割和添加组合两个方面功能,实现也很简单。
四、实现代码
#lang racket
(provide
(contract-out
(file->covert->file (-> string? void?))))
;解析行字符串:
(define (string-line str)
(let ([ls (string-split str ":")])
(string-append (string-trim (first ls))
","
(string-trim (second ls)))))
;解析编号行:
(define (id-line str)
(let ([ls (string-split str ":")])
(string-append (string-trim (first ls))
(string-trim (second ls)))))
;解析点行:
(define (point-line in)
(string-line (string-trim (read-line in))))
;解析边行:
(define (edge-line in)
(let ([ls (string-split (read-line in))])
(string-append
(string-line (first ls)) ","
(string-line (second ls)) ","
(string-line (last ls)))))
;递归读取并解析行信息:
(define (analysis-lines in result)
(let ([fl (read-line in)])
(if (equal? fl eof)
(reverse result)
(let ([str ;组合每段内各行为一个字符串
(string-append
;编号行:
(id-line (string-trim fl)) ","
;三行点值:
(point-line in) ","
(point-line in) ","
(point-line in) ","
;边长行:
(edge-line in) ","
;表面积行(和点行相同方式处理):
(point-line in))])
(read-line in) ;读取每段后的空行
(analysis-lines in (cons str result))))))
;文件转换:
(define (file->covert->file resource)
(let ([output (string-append
(first (string-split resource "."))
".txt")]
[in (open-input-file resource #:mode 'text)])
(with-output-to-file output
(lambda ()
(for ([strs (analysis-lines in '())])
(display strs)
(display "\n")))
#:mode 'text #:exists 'replace)
(close-input-port in)))
五、测试及实际应用
这里采用在代码文件内添加测试模块方式实现:
(module+ test
(define in-path1 "东入口防水毯表面积明细.log")
(define in-path2 "中轴区防水毯表面积明细.log")
;测试解析结果:
;(analysis-lines (open-input-file in-path1) '())
;获取结果:
(file->covert->file in-path1)
(file->covert->file in-path2)
)
六、注意事项
- 输入文件应为uft-8编码格式;
- 当前文件夹内目标文件在运行程序时会自动覆盖。
七、更进一步
为了一步到位,其实可以采用直接生成电子表格文件的方式完成。
实现这个功能编程的工作量相对比较大,考虑实用原则,这里未作涉及。有机会可以作进一步尝试。
版权声明:本文为chinazhangyong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。