2014-03-06 17 views
0

我正在編寫讀取csv文件並從中生成新的txt文件的代碼。問題是我不知道它的行中有多少個元素。例如,它可以是如何知道csv中有多少元素。 PERL

1,2,3,4,6 
6,7,8,9,10 

a,b,c 
d,e,f 

我使用的文字:CSV_XS但因爲它是獲得線作爲一個變量,我似乎無法能夠獲得它的長度。 有人可以幫助我解決這個基本問題嗎?

open(OUTFILE,'>file.txt'); 

my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ }); 
# #fields is a variable so can't seem to do $fields_size = @fields for its length 
my $fields = $csv->getline ($fh); 
while (my $row = $csv->getline ($fh)){ 
    for(my $c=0; $c <=1 ; $c++) 
     {print OUTFILE "$fields->[$c]=$row->[$c];";} 
    print OUTFILE "\n";  
} 
close $fh; 

這裏我假設只有2個元素,但我怎樣才能使:

for(my $c =0; $c <=$fields_size ; $c++) 

我的循環?

+0

[在perl中查找數組的長度]的可能重複(http://stackoverflow.com/questions/13744697/find-length-of-array-in-perl) – Barmar

+0

我試過我的$ size = scalar @ {$田};但我得到:在串聯(。)或字符串中使用未初始化的值 – yatici

+0

請閱讀代碼標記的SO文檔,以便人們不必編輯您的問題來修復它。 – Barmar

回答

3

雖然你的問題基本上是,「我怎樣才能得到數組中元素的個數,」它看起來像你在做什麼真正試圖做的是打印列標題和CSV中每個字段的值。

爲此,請使用Text::CSV'sgetline_hr而不是getline,這會將您的CSV的每一行存儲在散列引用中。那麼你不必跟蹤數組索引。以下按從左到右的順序打印每個字段和相關的列名稱:

# Set column names using first row in file 
$csv->column_names($csv->getline($fh)); 

while (my $hr = $csv->getline_hr($fh)) { 
    print "$_=$hr->{$_};" for $csv->column_names; 
    print "\n"; 
} 

請注意,您的列名稱必須是唯一的。

+0

不完全。只有在整行被​​處理後,我才需要新行。不是在每個元素之後。 – yatici

+0

我已經修正了它。謝謝你解決我的問題 – yatici

0

你可以這樣做:

my $fields = $csv->getline ($fh); 
my $size = scalar @$fields; 
+0

,它給了我錯誤:「在串聯(。)或字符串中使用未初始化的值」以及 – yatici

+0

這個錯誤意味着'$ fields'沒有設置。分配時出錯。 – Barmar

+0

my $ fields = $ csv-> getline($ fh);如果我循環固定數量的長度。我認爲$尺寸沒有分配。 – yatici

相關問題