首页 > 解决方案 > 在perl中用空格替换非数字字符的更简单方法是什么?

问题描述

我有类似以下行的字符串:

2020/07/02  03:15:00    CAT 14,3    km/h    OK  95,87   °   OK  14,1    °C  OK  75,83   % RH    OK  894,4   mbar    OK  *   mm  MISSING *   °C  MISSING *   °C  MISSING 9,9 °C  OK  0,0 W/m²    OK

我想替换所有非数字字符,并且只保留用空格分隔的数字。上面的数据线应该是:

2020 07 02  03:15   14.3    95.87   14.1    75.83   894.4   -99.    -99.    9.9     0.0 

我已经尝试过像下面的 MWE 中的替代品。代码运行没有任何错误,但没有被替换。我还附加了 perl 代码从文件中读取的数据。我的问题有两个:

  1. 为什么没有更换?
  2. 如何编写替换正则表达式?

我会很感激帮助

#!/usr/bin/perl -w

use strict;
use warnings;
my $IN=IO::File->new("textstr.txt", q{<}) or die "open 'textstr.txt': failed $! ($^E)";
my @textstr=<$IN>;


foreach my $textstr(@textstr){
chomp $textstr;
$textstr=~ s/\/\:\°\%//g; #replace all these characters by space
$textstr=~ s/km\/h//g;
$textstr=~ s/W\/m\^²//g;
$textstr=~ s/\*/-99.0/g;  #replace * by -99. as missing value
$textstr=~ s/\,/\./g;    #replace , as decimal point
$textstr=~ s/a-z||A-Z//g;

print "$textstr\n";
}

我无法附加数据,所以我将其附加在下面

2020/07/02      07:00:00        CAT     9,3     km/h    OK      129,41  °       OK      9,2     °C      OK      98,24   % RH    OK      895,9   mbar    OK      *       mm      MISSING *       °C      MISSING *       °C      MISSING 8,9     °C      OK      0,5     W/m²    OK
2020/07/02      07:15:00        CAT     8,2     km/h    OK      116,25  °       OK      10,5    °C      OK      94,73   % RH    OK      896,3   mbar    OK      *       mm      MISSING *       °C      MISSING *       °C      MISSING 9,7     °C      OK      79,0    W/m²    OK
2020/07/02      07:30:00        CAT     8,2     km/h    OK      116,25  °       OK      10,5    °C      OK      94,73   % RH    OK      896,3   mbar    OK      *       mm      MISSING *       °C      MISSING *       °C      MISSING 9,7     °C      OK      79,0    W/m²    OK
2020/07/02      07:45:00        CAT     8,2     km/h    OK      116,25  °       OK      10,5    °C      OK      94,73   % RH    OK      896,3   mbar    OK      *       mm      MISSING *       °C      MISSING *       °C      MISSING 9,7     °C      OK      79,0    W/m²    OK
2020/07/02      08:00:00        CAT     8,2     km/h    OK      116,25  °       OK      10,5    °C      OK      94,73   % RH    OK      896,3   mbar    OK      *       mm      MISSING *       °C      MISSING *       °C      MISSING 9,7     °C      OK      79,0    W/m²    OK
2020/07/02      08:15:00        CAT     16,2    km/h    OK      96,76   °       OK      15,4    °C      OK      72,39   % RH    OK      896,8   mbar    OK      0,0     mm      OK      8,7     °C      OK      27,1    °C      OK      10,5    °C      OK      275,0   W/m²    OK
2020/07/02      08:30:00        CAT     16,2    km/h    OK      96,76   °       OK      15,4    °C      OK      72,39   % RH    OK      896,8   mbar    OK      0,0     mm      OK      8,7     °C      OK      27,1    °C      OK      10,5    °C      OK      275,0   W/m²    OK
2020/07/02      08:45:00        CAT     16,2    km/h    OK      96,76   °       OK      15,4    °C      OK      72,39   % RH    OK      896,8   mbar    OK      0,0     mm      OK      8,7     °C      OK      27,1    °C      OK      10,5    °C      OK      275,0   W/m²    OK
2020/07/02      09:00:00        CAT     16,2    km/h    OK      96,76   °       OK      15,4    °C      OK      72,39   % RH    OK      896,8   mbar    OK      0,0     mm      OK      8,7     °C      OK      27,1    °C      OK      10,5    °C      OK      275,0   W/m²    OK

标签: perl

解决方案


您需要为/:°%and使用字符类a-z

foreach my $textstr(@textstr){
    chomp $textstr;
    $textstr=~ s/[\/:°%]/ /g; #replace all these characters by space
    $textstr=~ s/km\/h//g;
    $textstr=~ s/W.*//;
    $textstr=~ s/\*/-99.0/g;  #replace * by -99. as missing value
    $textstr=~ s/,/./g;    #replace , as decimal point
    $textstr=~ s/[a-z]//gi;
    print "$textstr\n";
}

对于/:°%,您还需要在替换中添加一个空格。

对于a-z,您可以使用不区分大小写的修饰符 进行简化i

我采取了极端措施来摆脱讨厌的上标²。您可能想查看那个。

我还消除了一些不必要的反斜杠。


这可以让你大部分时间到达那里。它用空格替换所有冒号,但您的输出保留第一个冒号并删除第二个冒号后的 2 位数字。


推荐阅读