2016-04-26 54 views
0

我正在解析一個大的.CSV文件,並且由於Excel和Microsoft的無限幫助而遇到問題 - 在Excel中打開.CSV文件以清除很多問題在它到達我之前,但現在我有一個領域已經添加了前導零。 Excel不起作用(至少我找到了),因爲這個特定的字段是ProductNumber,可以有字母和數字的任意組合。問題出現了,因爲某些產品編號以點開頭,即 - .12345678。有時點稍後 - 12.345678,有時不點 - 123456789,有時字母和/或字母和數字混合 - ABCDEFGHI或A12D34G56。Perl - 使用文本和數字修整字段中的前導零

在每種情況下,該字段需要爲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]; 
+0

修剪前導零,你可以做'S/^ 0 + //'我不知道你問的 –

+0

我想僅當字段以「0」開始時才調整零點。 - 如果它以其他方式開始 - 即使是「00」,我也不想修剪它。只有當它以0開頭,然後是小數時才需要修剪它。 – BigRedEO

+1

好吧,然後嘗試's/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 
+0

這隻會在第一個零之後有一個點時才起作用,而不是以「00」,「01」,「02」等開頭的任何東西。 – BigRedEO

+0

@BigRedEO正確。我已經解釋了正則表達式 – Vikhram

+0

謝謝 - 這似乎已經完成了。 – BigRedEO

相關問題