2020년 5월 27일 수요일

Text::ParseWords - parse text into an array of tokens or array of arrays

CSV(comma-separated values) 파일을 파싱할 때 간혹 매우 성가신 상황이 벌어지기도 한다. 모든 필드를 따옴표로 둘러싸서 CSV를 만든 것은 좋은데, 그 내부에 또 콤마가 들어있는 경우가 있기 때문이다. Roary가 만든 gene_presence_absence.csv 파일을 Perl로 파싱하다가 결과가 좀 이상해서 원본 파일을 들여다보니 세번째 컬럼(functional annotation)에 콤마가 삽입된 것을 만나면서 이상 작동을 한 것이었다. 효소 명칭 중에는 이런 것이 매우 흔하다.

에휴... 이걸 어떻게 손을 댄다? 파이썬에는 아주 현명한 해결 방법이 있는지는 모르겠으나 구글을 뒤지니 Text::ParseWords라는 모듈이 이 일에 딱 맞는 것 같다. quotewords() 함수가 핵심이다.

@words = quotewords($delim, $keep, @lines);
$keep 인수는 무슨 용도일까? 매뉴얼을 살펴보았다(perdoc Text::ParseWords). 이것은 boolean flag이고, 내가 참조한 코드에서는 0, 즉 false를 공급하였었다. 이것이 true이면 모든 토큰은 $delim에 의하여 분리되지만 quote, backslash 등의 문자는 토큰 내에 그대로 남는다. $keep이 false라면 역슬래쉬로 escape하거나 작은 따옴표 안에 들어있지 않은 모든 따옴표와 역슬래쉬는 제거된다... 흠, 무슨 말인지 알 것도 같고 아닌 것도 같고.

댓글 없음: