2013-05-31 2 views
1

CSV에서 들어오는 데이터를 판매 시스템에서 읽을 수있는 형식으로 다시 포맷하는 스크립트가 있습니다. 나는 미쳐 가고 있을지 모르지만, 프로덕션 환경에서 일주일이나 이틀 전부터 일했다고 확신합니다. 그러나 지난 한두 주간의 어느 시점에서 작동이 멈췄습니다. 문제는 $ csv-> fields() 속성을 채우지 않는 Text :: CSV 모듈로 추적했습니다.

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

자, (2 주 전, 너무 프로덕션 환경에서 적어도 내 머리와,,) 내 로컬 컴퓨터에,이 구문 분석 된 헤더 필드와 @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 당 을 반환하면 getline()을 호출 한 후 예상되는 결과는 fields()입니다. 먼저 parse()을 사용해보십시오. 로컬 컴퓨터에서이 모듈의 다른 버전을 사용 중일 수 있습니다. perl -MText::CSV -e 'print $Text::CSV::VERSION'을 사용하여 버전을 확인할 수 있습니다.

은 getline()을 사용한 후에 반환 값이 정의되지 않으므로 parse()에서 반환 한 데이터 구조를 채우지 않습니다.

+0

은'$ csv-> column_names'를 사용하고 있습니까? 구문 분석을 사용하기 위해 코드를 다시 작성했고, 이제'$ 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 ; 
관련 문제