加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl 完成一个固定格式的文本文件处理

发布时间:2020-12-15 23:50:16 所属栏目:大数据 来源:网络整理
导读:??????? 昨天刚开始学习perl ,真是太有意思了!而且完全用小写字母,爽……开发速度快,而且和C一样很强大,平台移植性好,很多很多优点,最主要是上手快。恐怕这是脚本的优点吧!初学总感觉和shell很像,之后就看出其相同点和不同点了! ??????? 后来一老

??????? 昨天刚开始学习perl ,真是太有意思了!而且完全用小写字母,爽……开发速度快,而且和C一样很强大,平台移植性好,很多很多优点,最主要是上手快。恐怕这是脚本的优点吧!初学总感觉和shell很像,之后就看出其相同点和不同点了!

??????? 后来一老师要求做一个文本文件处理的程序,本想用C 或者C#完成的,但想想之后还要在老师那里装一个很大的运行环境,又加上刚学perl ,很想弄点有意思的东西,于是决定用perl 写。

??????? 文件格式大致如下:

??????? 08 13 94 52 00 00 00 00 00 00 00 00 00 00 00

??????? 08 13 80 85 00 00 00 00 00 00 00 00 00 00 00

??????? 08 13 80 85 00 00 00 00 00 00 00 00 00 00 00

??????? 08 13 51 55 00 00 00 00 00 00 00 00 00 00 00

??????? ……

??????? 注:此处已经做了换行显示,文本文件中没有换行符,只有数字和空格

??????? 每一个数字 (如 08 , 13 )是一个BCD码, 以每 5 个数字携带一个变量的值,则每15个 数字携带三个变量某一时刻的值。如第一行 08 13 94 52 00 |? 00 00 00 00 00 | 00 00 00 00 00 红色的携带变量1,绿色的携带变量2,蓝色的携带变量3。每一变量的解析格式为:前四位BCD码代表数值部分,最后一位代表指数部分,则变量1的值为:0.8139452 * 10^0 .

??????? 主要是对数组的操作,思路是将文件打开读入所有的数据,并按‘ ’将数据split 成数组,之后操作这数组吧!

???????? 听说perl 实现的功能千差万别, 相同的功能 可能写成 1w行代码 ,也可能写成10w 行代码,就看编程人员的功底。我刚开始学, 也不管了!实现就行。上代码:

#! perl

# author : YEZ
# date : 2014/12/ 9
# describe : convert 15 - bytes data to double string;

# Dre@mtech Working Group

# open file and get file handler fp
open (fp,$ARGV[0]) || die ("cannot open input file $ARGV[0]!rn");

# file content;
$content = <fp>; # read file content string to varible 
# $len = @content;  # or use scalar (@content)

@each = split (/ /,$content);
# file array length;
$eachlen = @each;

# die ("error! file format is invali!!!rn")  if ($eachlen % 15 != 0);

# get start index from @each in each step,to calculate
$i = 0;   

while (
# $i != $eachlen
$eachlen > 0
) {
	$adjust = 0;
	while ($each[$adjust] == 0) {
		$adjust ++;
	}
	@frame = @each[($i + $adjust) .. ($i + $adjust + 14)];

	# start calculate
	$torsion = (($frame[0].$frame[1].$frame[2].$frame[3]) * (0.1 ** 7)) * (10 ** $frame[4]);  # var1
	$speed = (($frame[5].$frame[6].$frame[7].$frame[8]) * (0.1 ** 7)) * (10 ** $frame[9]);    # var2
	$power = (($frame[10].$frame[11].$frame[12].$frame[13]) * (0.1 ** 7)) * (10 ** $frame[14]);  # var 3
	
	print ("$torsion  $speed  $power rn");   # output and redirect to a file
	
	$i += 15 + $adjust;    # move array start index
	$eachlen -= 15 + $adjust;
	if ($eachlen - 15 < 15) {
		$x = 1;
	}
}

close (fp);   # close file handler

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读