忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
1234下一页
最近访问板块 发新帖
查看: 4686 | 回复: 33

TXT中一个坐标列,一个数据列,将数据按坐标生成map [复制链接]

论坛徽章:
0
发表于 2018-02-01 15:07 |显示全部楼层
5可用积分
本帖最后由 情节可以很简单 于 2018-02-01 17:12 编辑

我的需求是:看电压分布。
1.电压值按50mV等级替换:
        0< A <=1.4000;
1.4000< B <=1.4500;
1.4500< C <=1.5000;
1.5000< D <=1.5500;
1.5500< E <=1.6000;
1.6000< F <=1.6500;
1.6500< G <=1.7000;
1.7000< H <=1.7500;
1.7500< I <=1.8000;
1.8000< J ;

2.将第三列电压值按照坐标生成数据图, 空白坐标可以用“0”或其他任何 表示。
3.还有一个难点:有坐标相同的点,取其中任意一点替代。
#----------------------------------------
我的输入TXT为:( Y坐标:1~73;X坐标:不定)第一列坐标X值大小顺序没有规律,且Y相同--X的范围也不是固定的。
另外如果第二列“bgr_trim8”碍眼,我可以去掉。
(7,1)            bgr_trim8        1.4796        V
(8,1)            bgr_trim8        1.6455        V
(9,1)            bgr_trim8        1.5645        V
(10,1)            bgr_trim8        1.5863        V
(7,1)            bgr_trim8        1.4803        V
(-1,1)            bgr_trim8        1.6614        V
(0,1)            bgr_trim8        1.6055        V
(1,1)            bgr_trim8        1.6841        V
(2,1)            bgr_trim8        1.5392        V
(3,1)            bgr_trim8        1.6637        V
(4,1)            bgr_trim8        1.6190        V
(5,1)            bgr_trim8        1.6247        V
(6,1)            bgr_trim8        1.6122        V
(1,1)            bgr_trim8        1.6867        V
(-5,1)            bgr_trim8        -124.1541        mV
(-9,2)            bgr_trim8        1.5492        V
(-8,2)            bgr_trim8        1.6070        V
(-7,2)            bgr_trim8        1.5932        V
(-6,2)            bgr_trim8        1.4986        V
(-5,2)            bgr_trim8        1.5313        V
(-4,2)            bgr_trim8        1.6900        V
(-3,2)            bgr_trim8        1.6924        V
(-2,2)            bgr_trim8        1.5223        V
(-1,2)            bgr_trim8        1.6690        V
(0,2)            bgr_trim8        1.7155        V
(1,2)            bgr_trim8        1.6334        V
(-6,2)            bgr_trim8        1.4990        V

.......         ............     ........      ...


#----------------------------------------
能不能过好这个年就差这一哆嗦了!给大家拜个早年!








最佳答案

查看完整内容

回复 28# 情节可以很简单 老奶奶都不扶,就服你。不过我没有在两侧标出坐标轴,这个问题就留给题主了。
打赏鼓励一下!

1人打赏

论坛徽章:
11
子鼠
日期:2014-10-11 16:46:4815-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:532016科比退役纪念章
日期:2018-03-16 10:24:05
发表于 2018-02-01 15:07 |显示全部楼层
本帖最后由 523066680 于 2018-02-02 19:07 编辑

回复 28# 情节可以很简单

老奶奶都不扶,就服你。不过我没有在两侧标出坐标轴,这个问题就留给题主了。

  1. use List::Util qw/max min/;
  2. STDOUT->autoflush(1);

  3. my @data = read_file("bgr_trim8.txt");

  4. our ( @X, @Y, @Z, %edge );
  5. for my $row ( @data )
  6. {
  7.     $row=~/\((-?\d+),(-?\d+)\)\s+(\w+)/;
  8.     push @X, $1;
  9.     push @Y, $2;
  10.     push @Z, $3;
  11. }

  12. %edge = (
  13.     'x' => { 'min' => min( @X ), 'max' => max( @X ) },
  14.     'y' => { 'min' => min( @Y ), 'max' => max( @Y ) },
  15. );

  16. our @buffer;
  17. create_buffer();
  18. draw_buffer();
  19. <STDIN>;

  20. sub draw_buffer
  21. {
  22.     our ( @X, @Y, @Z, %edge );
  23.     my ($x, $y, $str);
  24.     for my $id ( 0 .. $#X )
  25.     {
  26.         $x = $X[$id] - $edge{x}{min};
  27.         $y = $Y[$id] - $edge{y}{min};
  28.         $buffer[ $y ][ $x ] = $Z[$id];
  29.     }

  30.     $str = join "\n", map { join("", @$_ ) } ( @buffer );
  31.     print $str;
  32.     write_file("graph.txt", $str );
  33. }

  34. sub create_buffer
  35. {
  36.     my $dtx = $edge{x}{max} - $edge{x}{min} + 1;
  37.     my $dty = $edge{y}{max} - $edge{y}{min} + 1;
  38.     grep { push @buffer, [(".")x$dtx]; } ( 1 .. $dty );
  39. }

  40. sub read_file
  41. {
  42.     open my $fh, "<", $_[0];
  43.     return (<$fh>);
  44. }

  45. sub write_file
  46. {
  47.     open my $fh, ">", $_[0];
  48.     print $fh $_[1];
  49.     close $fh;
  50. }
复制代码

1人打赏

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2018-02-01 16:15 |显示全部楼层
本帖最后由 jason680 于 2018-02-01 16:21 编辑

回复 1# 情节可以很简单

1. input data
2. procedure
3. output data


1.4501咋办?

我的需求是:
1.电压值按50mV等级替换:
               J:<1.4000;
               A:1.4000~1.4500;
       1.4501咋办?
               B:1.4600~1.5000;
               C:1.5100~1.5500;

论坛徽章:
0
发表于 2018-02-01 16:37 |显示全部楼层
本帖最后由 情节可以很简单 于 2018-02-01 16:49 编辑

回复 2# jason680

诶呀!脑子只转了半圈!
        0< A <=1.4000;
1.4000< B <=1.4500;
1.4500< C <=1.5000;
1.5000< D <=1.5500;
1.5500< E <=1.6000;
1.6000< F <=1.6500;
1.6500< G <=1.7000;
1.7000< H <=1.7500;
1.7500< I <=1.8000;
1.8000< J ;

#------------------------
我单纯试了一下替换:
  if( ( 1.5000 < ((split)[2]) ) && ( ((split)[2]) <= 1.5500) )
  {
    s/$1/D/g;   #"$1" 这里该写啥啊,我试了几种就这个 结果可以有改变。
  }

结果长这样:

(0,1)        1.6055
(1,1)        1.6841
D(D2D,D1D)D        D    #只替换了这一等级,但是坐标咋被穿插了这么多“D”
(3,1)        1.6637
(4,1)        1.6190
(5,1)        1.6247
(6,1)        1.6122


论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2018-02-01 17:22 |显示全部楼层
回复 3# 情节可以很简单

$ perl get_50mv.pl file
(7,1)            bgr_trim8        1.4796        V    C
(8,1)            bgr_trim8        1.6455        V    F
(9,1)            bgr_trim8        1.5645        V    E
(10,1)            bgr_trim8        1.5863        V    E
(7,1)            bgr_trim8        1.4803        V    C
(-1,1)            bgr_trim8        1.6614        V    G
(0,1)            bgr_trim8        1.6055        V    F
(1,1)            bgr_trim8        1.6841        V    G
(2,1)            bgr_trim8        1.5392        V    D
(3,1)            bgr_trim8        1.6637        V    G
(4,1)            bgr_trim8        1.6190        V    F
(5,1)            bgr_trim8        1.6247        V    F
(6,1)            bgr_trim8        1.6122        V    F
(1,1)            bgr_trim8        1.6867        V    G
(-5,1)            bgr_trim8        -124.1541        mV    A
(-9,2)            bgr_trim8        1.5492        V    D
(-8,2)            bgr_trim8        1.6070        V    F
(-7,2)            bgr_trim8        1.5932        V    E
(-6,2)            bgr_trim8        1.4986        V    C
(-5,2)            bgr_trim8        1.5313        V    D
(-4,2)            bgr_trim8        1.6900        V    G
(-3,2)            bgr_trim8        1.6924        V    G
(-2,2)            bgr_trim8        1.5223        V    D
(-1,2)            bgr_trim8        1.6690        V    G
(0,2)            bgr_trim8        1.7155        V    H
(1,2)            bgr_trim8        1.6334        V    F
(-6,2)            bgr_trim8        1.4990        V    C

$ cat get_50mv.pl

use strict;
use warnings;

my $sVolt_lo = 1.4;
my $sVolt_hi = 1.8;
my $sVolt_st = 0.05;

my %hVolt_step;

my $sVolt = $sVolt_lo;
my $sVolt_step = "A";

sub next_step{
  my ($sStep) = @_;
  return(chr(ord($sStep)+1));
}
while($sVolt <= $sVolt_hi){
  $sVolt_step = next_step($sVolt_step);
  $hVolt_step{$sVolt} = $sVolt_step;  
  $sVolt += $sVolt_st;
}

my %hVolt_unit = (
  'mV' => 10**-3,
  'V'  => 1,
  'kV' => 10**3,
);


while(<>){
  chomp;
  my @aData = split;
  if(! exists $hVolt_unit{$aData[3]}){
    print STDERR "*** ERROR ****: unknow voltage unit\n$_\n";
    next;
  }
  my $sVolt = $aData[2] * $hVolt_unit{$aData[3]};
  if($sVolt <= $sVolt_lo){
    print "$_\tA\n";
    next;
  }
  if($sVolt > $sVolt_hi){
    print "$_\t$hVolt_step{$sVolt_hi}\n";
    next;
  }
  my $sStep = int((($sVolt-$sVolt_lo)*1000-1)/($sVolt_st*1000))*$sVolt_st+$sVolt_lo;
  print "$_\t$hVolt_step{$sStep}\n";

}

1人打赏

论坛徽章:
0
发表于 2018-02-01 18:02 |显示全部楼层
回复 4# jason680

谢谢大神!看到您这样按步自动分级令我茅塞顿开!运行了,结果也是正确的!
与此同时,我按照我那本方法也实现了全部替换。
结果如下:

#---------------------
(7,1)            C               
(8,1)            F               
(9,1)            E               
(10,1)            E               
(7,1)            C               
(-1,1)            G               
(0,1)            F               
(1,1)            G               
(2,1)            D               
(3,1)            G               
(4,1)            F               
(5,1)            F               
(6,1)            F               
(1,1)            G               
(-5,1)            A               
(-9,2)            D               
(-8,2)            F               
(-7,2)            E               
(-6,2)            C               
(-5,2)            D               
(-4,2)            G               
(-3,2)            G               
(-2,2)            D               
(-1,2)            G               
(0,2)            H               
(1,2)            F               
(-6,2)            C               
(-4,2)            G               
(-3,2)            G

.......         ..

#--------------------------------
现在还差按坐标生成图了。。。
重复的坐标按其中一个就行。空白坐标用任意符号代替。
这个我连笨思路都想不通

论坛徽章:
11
子鼠
日期:2014-10-11 16:46:4815-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:532016科比退役纪念章
日期:2018-03-16 10:24:05
发表于 2018-02-01 21:15 |显示全部楼层
本帖最后由 523066680 于 2018-02-01 22:51 编辑



看到数据中有个负数,也归为A是吗

  1. use File::Slurp;
  2. STDOUT->autoflush(1);

  3. our %ranks = (
  4.     A => [-10000, 1.4000],
  5.     B => [1.4000, 1.4500],
  6.     C => [1.4500, 1.5000],
  7.     D => [1.5000, 1.5500],
  8.     E => [1.5500, 1.6000],
  9.     F => [1.6000, 1.6500],
  10.     G => [1.6500, 1.7000],
  11.     H => [1.7000, 1.7500],
  12.     I => [1.7500, 1.8000],
  13.     J => [1.8000, 100000],
  14. );

  15. my @data = read_file("data.txt");
  16. my (@col, $rank);

  17. for my $row ( @data )
  18. {
  19.     $row=~s/\r?\n//;
  20.     @col = split( /\s+/, $row );
  21.     $rank = get_rank( $col[2] );
  22.     printf "%s    %s\n", $row, $rank;
  23. }

  24. sub get_rank
  25. {
  26.     our (%ranks);
  27.     my $val = shift;
  28.     my ($rank) = grep { inrange( $val, $ranks{$_} ) && $_ } keys %ranks;
  29.     return $rank;
  30. }

  31. sub inrange
  32. {
  33.     my ($v, $ref) = @_;
  34.     return ($v > $ref->[0] and $v <= $ref->[1]) ? 1 : 0;
  35. }
复制代码

你的数据能不能压缩发个完整的到网盘?不然真是到时候做出来又有其他状况。
数据作图是3D点云图吧?X,Y + 电压值,三个向量。

论坛徽章:
0
发表于 2018-02-02 10:15 |显示全部楼层
本帖最后由 情节可以很简单 于 2018-02-02 10:24 编辑

回复 6# 523066680

让您费心了,
我把原文件压缩了,在添加附件时:上传完毕后,提示附件无法保存!
另外我怎么通过百度网盘传给你呀..需要账号吗
总之目前的结果能达到下面这样:能确定的是Y从1~73,但是X看不出来。
#--------------------------------
(7,1)            C               
(8,1)            F               
(9,1)            E               
(10,1)            E               
(7,1)            C               
(-1,1)            G               
(0,1)            F               
(1,1)            G               
(2,1)            D               
(3,1)            G               
(4,1)            F               
(5,1)            F               
(6,1)            F               
(1,1)            G               
(-5,1)            A               
(-9,2)            D               
(-8,2)            F               
(-7,2)            E               
(-6,2)            C               
(-5,2)            D               
(-4,2)            G               
(-3,2)            G               
(-2,2)            D               
(-1,2)            G               
(0,2)            H               
(1,2)            F               
(-6,2)            C               
(-4,2)            G               
(-3,2)            G               
(-1,2)            G               
(0,2)            H               
(2,2)            F               
(3,2)            E               
(4,2)            D               
(5,2)            E               
(6,2)            H               
(7,2)            G               
(8,2)            F               
(9,2)            E               
(6,2)            H
.......         ..
#----------------------
字母按照对应坐标生成坐标图。
难点:
1.有重复坐标 取其中任一个;
2.坐标够不成整齐的矩形或圆形,需用“0”或空格补满。

大致思路:是否可以把坐标X排序(Y顺序不变),并按最长X补齐坐标。。但是我觉得无法实现吧。。。也许我想的太复杂了!


论坛徽章:
11
子鼠
日期:2014-10-11 16:46:4815-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:532016科比退役纪念章
日期:2018-03-16 10:24:05
发表于 2018-02-02 10:23 |显示全部楼层
本帖最后由 523066680 于 2018-02-02 12:37 编辑

回复 7# 情节可以很简单

先不说这个,你有百度网盘吗,或者 www.ys168.com 也不错。
注册页面 http://www.ys168.com/register.aspx

——
问题补充:
你说的作图是字符图而不是渲染图?

把电压作为高度渲染出来了,(图中y轴数据是错的,请无视)
1.png

修正一下:
coord.png

论坛徽章:
0
发表于 2018-02-02 12:38 |显示全部楼层
本帖最后由 情节可以很简单 于 2018-02-02 12:41 编辑

回复 8# 523066680

我有百度网盘,账号17778056201 我的百度云链接:https://pan.baidu.com/mbox/homepage?userShort=qZNe8XI 有效期:3天。点击就可以和我发文件和消息了。
另外我有个疑问:
1.渲染图的表现形式是带颜色的字母吗?随电压升高颜色变化。
2.目前只需要字符分布
3.如果1成立,那结果就更直观了,如果麻烦,就不要了。

万分感激!来自一个搞电路硬件的软妹子。。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP