2012-03-11 3 views
3

0000-2400 시간 형식 인 CSV의 일부 문자열을 00-24 시간 형식으로 변환하려고합니다. 예 :Regex를 사용하여 CSV의 특정 열을 수정하십시오.

2011-01-01,"AA",12478,31703,12892,32575,"0906",-4.00,"1209",-26.00,2475.00 
2011-01-02,"AA",12478,31703,12892,32575,"0908",-2.00,"1236",1.00,2475.00 
2011-01-03,"AA",12478,31703,12892,32575,"0907",-3.00,"1239",4.00,2475.00 

7 번째 및 9 번째 열은 각각 출발 및 도착 시간입니다.

2011-01-01,"AA",12478,31703,12892,32575,"09",-4.00,"12",-26.00,2475.00 

전체 CSV 결국 R로 가져옵니다을 나는 시도하고 좀 큰 것 때문에 미리 처리의 일부를 처리하는 경우 : 바람직 나는 끝났어요 때 라인은 다음과 같이한다. 나는 처음에는 Perl로 이것을 시도했지만 정규 표현식을 사용하여 여러 자리를 선택하는 데 어려움을 겪고있다. lookbehind 표현식을 사용하여 주어진 쉼표 앞에 하나의 숫자를 얻을 수 있지만 둘 이상의 표현식은 사용할 수 없습니다.

은 또한 펄이 일을하는 것은 불필요 바보 내가 R.에 충실해야 :)

+1

나는 그런 [텍스트 :: CSV (CSV로를 처리 할 수 ​​있도록 설계 모듈을 사용하는 것이 좋습니다 것입니다 http://search.cpan.org/perldoc?Text :: CSV). – TLP

답변

2

의견에서 언급 한 것처럼 Text::CSV과 같은 CSV 모듈을 사용하는 것이 안전한 옵션입니다. 이것은 그 사용법에 대한 간단한 샘플 스크립트입니다. 당신은 따옴표를 유지하지 않는다는 것을 알게 될 것입니다, 비록 내가 keep_meta_info에 넣었으므로, 그것은해야합니다. 중요한 일이라면 해결할 수있는 방법이있을 것입니다.

use strict; 
use warnings; 
use Data::Dumper; 

use Text::CSV; 
my $csv = Text::CSV->new({ 
     binary => 1, 
     eol => $/, 
     keep_meta_info => 1, 
}); 
while (my $row = $csv->getline(*DATA)) { 
    for ($row->[6], $row->[8]) { 
     s/\d\d\K\d\d//; 
    } 
    $csv->print(*STDOUT, $row); 
} 

__DATA__ 
2011-01-01,"AA",12478,31703,12892,32575,"0906",-4.00,"1209",-26.00,2475.00 
2011-01-02,"AA",12478,31703,12892,32575,"0908",-2.00,"1236",1.00,2475.00 
2011-01-03,"AA",12478,31703,12892,32575,"0907",-3.00,"1239",4.00,2475.00 

출력 :

2011-01-01,AA,12478,31703,12892,32575,09,-4.00,12,-26.00,2475.00 
2011-01-02,AA,12478,31703,12892,32575,09,-2.00,12,1.00,2475.00 
2011-01-03,AA,12478,31703,12892,32575,09,-3.00,12,4.00,2475.00 
+0

이 업데이트를 제공해 주셔서 감사합니다. 나는 원래 무언가 바보 같고 안전하지 못하다 싶었지만 이것은 아마 현명하다. :) –

+0

@AdamHyland 여러분을 환영합니다. – TLP

3

내가뿐만 아니라

s/"(\d\d)\d\d"/"$1"/g 
인이 내 자신의 솔루션을 제공 할 수 있다고 말했다되기 열려있어
관련 문제