Perl - 使用文本和数字修剪字段前导零

时间:2016-04-26 18:12:04

标签: excel perl csv

我正在解析一个大的.CSV文件,并且由于Excel和Microsoft的无限帮助而遇到了一个问题 - 在Excel中打开.CSV文件以便在它到达我之前清除很多问题,但是现在我有一个字段,其中添加了前导零。 Excel不起作用(至少我发现),因为此特定字段是ProductNumber,可以包含字母和数字的任意组合。问题出现是因为某些产品编号以点开头,即 - .12345678。有时点后来 - 12.345678,有时没有点 - 123456789,有时字母和/或字母和数字混合 - ABCDEFGHI或A12D34G56。

在每种情况下,字段必须为9个字符或更少。但Excel通过一个以“小数点(十进制)”开头的任何ProductNumber的“有用”前导零 - 所以我有0.12345678,将其变成一个10个字符的ProductNumber。我需要修剪前导零 - 仅在字段以“0”开头的情况下。有很多产品编号以“10”,“20”开头。等等。不想碰那些。

那么,在我解析时,有没有办法让我使用标量变量?

所以,说我的文件有

0.12345678
10.123456
A12B34C56
ABCDEFGHI

我有这样的事情开始 -

my $filename = 'test.csv';

open my $FH, $filename
  or die "Could not read from $filename <$!>, program halting.";

# Read the header line.
chomp(my $line = <$FH>);
my @fields = split(/,/, $line);
print Dumper(@fields), $/;

my @data;
# Read the lines one by one.
while($line = <$FH>) {

# split the fields on the comma.
    chomp($line);
    my @fields = split(/,/, $line);

# Remove leading zero on ProductNumber Field
    $_ =                      for $fields[17];

1 个答案:

答案 0 :(得分:4)

  

我需要修剪前导零 - 仅在场的情况下   以“0”开头。

您可以使用正则表达式将前导0.替换为.,从而有效删除零。

my @data;
# Read the lines one by one.
while($line = <$FH>) {

    # split the fields on the comma.
    chomp($line);
    my @fields = split(/,/, $line);

    # Remove leading zero on ProductNumber Field
    $fields[17] =~ s/^\s*0\././;

让我解释一下正则表达式

^    - Match the start of the string
\s*  - Match zero or more spaces
0\.  - Match the number zero followed by a dot character