2017-07-17 52 views
-3

我對我在線下載的CSV文件有以下格式,需要解析它。我希望能夠擺脫'單位'專欄。我怎麼能這樣做呢?我希望能夠在解析文件時做到這一點,而不是將其複製到不同的文件,因爲文件非常大。謝謝!在Perl中csv中刪除列

<radio>,<mcc>,<net>,<area>,<cell>,<unit>,<lon>,<lat>,<range>,<samples>,<changeable>,<created>,<updated>,<averageSignal> 
UMTS,262,2,801,86355,,13.28527,52.521711,37,7,1,1282569574,1300175362,-91GSM,262,2,801,1795,,13.276605,52.525348,5714,9,1,1282569574,1300175362,-87 
+4

您沒有嘗試任何東西 – ssr1012

+2

「*由於文件非常大,因此不會將其複製到其他文件*」如果您有足夠的內存,則可以將內容保留在內存中。但是,否則,請逐行讀取文件,從每行中刪除該字段,寫入新文件,成功完成後,將新文件重命名爲原始文件。 –

+0

https://metacpan.org/pod/Text::CSV將允許您讀取文件,將所有列與不需要的列一起存儲並將其寫回。如果你遇到困難,請去做一些事情然後更新你的問題。 –

回答

-1
#!/usr/bin/env perl 

use strict; 
use warnings; 

my $col_to_delete = '<unit>'; 

chomp (my @header = split /,/, <>); 
my @newheader = grep { not $_ eq $col_to_delete } @header; 

print join (",", @newheader),"\n"; 

while (<>) { 
    chomp; 
    my %row; 
    @row{@header} = split /,/; 
    print join (",", @row{@newheader}),"\n"; 

} 

標準輸入讀取一行一行,並打印,當您去,這樣你就不會需要大量的內存。

您可以通過就地編輯來做到這一點,但您需要測試它以確保它首先能夠令人滿意地工作。你可以通過設置$^I來做到這一點,但實際上你最好創建兩個文件,因爲意外地打開一個文件非常容易。