2013-05-31 31 views
1

我有一個腳本,可以通過出售系統將來自CSV的傳入數據重新格式化爲可讀格式。我可能會瘋了,但我非常肯定它在一兩個星期前在生產環境中工作。但是,在上個星期或之後的某個時候,它停止了工作。我跟蹤到Text :: CSV模塊沒有填充$ csv-> fields()屬性的問題。現在

my $csv = Text::CSV->new({sep_char => '|', allow_loose_quotes => 1}); 
$csv->column_names($csv->getline(*READ)); 
my @keys = $csv->fields; 

,我的本地機器(和,至少在我的頭上,在生產環境中的兩個星期前,太)上,這將填充解析報頭字段@keys。但是,現在,無論是在生產還是在生產前期,這都失敗了。我唯一能區分的是我的機器運行的是perl 5.12.4,而prod/pprd是5.8.8。兩者上的Text :: CSV模塊都是1.21。

在我的機器,如果我使用數據::自卸車和轉儲$ CSV對象,屬性的一部分是

'_FIELDS' => [ 
    'ID', 
    'IDCARD_TYPE', 
    'FIRST_NAME', 
    'MIDDLE_NAME', 
    'LAST_NAME', 
    ... 
    'EMAIL', 
], 

在其他機器:

'_FIELDS' => undef, 

我工作通過使用$ csv-> column_names來填充@keys,但是看起來並不正確,我真的很想弄清楚發生了什麼。有任何想法嗎?

+0

會發生什麼? – raina77ow

+0

它返回一個數組,其字段名稱與'_FIELDS'屬性應該類似,並且出現在_COLUMN_NAMES屬性中。這在我的機器和prod/pprd機器上都是一樣的。 –

回答

2

根據Text::CSV documentation,返回undeffields()在撥打getline()後的預期結果。先嚐試使用parse()。您可能在本地計算機上使用此模塊的不同版本。您可以使用perl -MText::CSV -e 'print $Text::CSV::VERSION'來檢查版本。

請注意,返回值在使用getline()後未定義,其中 未填充由parse()返回的數據結構。

+0

正在使用'$ csv-> column_names'安全嗎?我已經重寫了代碼來使用parse,現在我可以使用'$ csv-> fields',我只是想了解使用模塊的正確方法。根據文檔,'$ csv-> column_names'不應該返回任何東西,應該如何? –

0

繼交替順序爲我工作:當你傾倒`$ csv->函數getline(* READ)`結果

$file = "test.csv" ;  
if(!open($fh, "<", $file)) { 
    # Cannot call getline is a symptom of a bad open() 
    printf("### Error %s: could not open file %s\n", $ws, $file) ; 
    close($fh) ; 
    exit 1 ; 
} 
while(my $row = $csv->getline($fh)) { 
    # $row is a pointer to an Array 
    #  The array is already parsed. 
    @items = @{$row} ; 
    for(my $i=0 ; $i<=$#items; $i++) { 
    printf("Field %d: (%s)\n", $i, $items[$i]) ; 
    } 
} 
close $fh ;