Cass面积数据文件转换

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)
  
  )

六、注意事项

  1. 输入文件应为uft-8编码格式;
  2. 当前文件夹内目标文件在运行程序时会自动覆盖。

七、更进一步

为了一步到位,其实可以采用直接生成电子表格文件的方式完成。
实现这个功能编程的工作量相对比较大,考虑实用原则,这里未作涉及。有机会可以作进一步尝试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值