2012-09-23 3 views
1

postgres 데이터베이스로로드해야하는 데이터가 들어있는 텍스트 파일이 제공됩니다.메시 업 레코드 - 필드 내용 안의 구분자

파일은 물결표 (~)로 구분 된 필드가있는 레코드 (한 줄에 하나씩)로 구성됩니다. 불행하게도 매번 필드 내용에 물결표가 포함됩니다.

파일이 깔끔하지 않은 CSV이고 물결표가 이스케이프되지 않았기 때문에 데이터베이스에서 예외가 발생하고로드가 중단되는 원인이되는 너무 많은 필드가 포함 된 레코드가됩니다.

레코드가 어떻게 표시되는지 (텍스트, 정수, 부동 필드) 알고 있습니다.

누구든지 longong 레코드를 수정하는 방법에 대한 제안이 있습니까? 나는 per 코드를 사용하지만 파이썬, 자바 스크립트, 일반 영어의 제안에 만족합니다.

+2

예제를 제공해 주시겠습니까? – Zaid

+0

펄의'Text :: CSV' 모듈이나 파이썬의'csv' 모듈은 어떻게됩니까? – squiguy

+0

텍스트 필드가 인용되어 있습니까? 예 : ''foo "~ 123 ~ 1.25' –

답변

1

당신이 좋아하는 뭔가 손상된 행을 필터링을 시도 할 수 있습니다 :

perl -F'~' -lane 'print if @F > 10' input.txt > broken_fields.txt 

은 (필드의 사용자의 최대 수를 10 가정). 그것은 당신에게 당신이 수작업으로 검사 할 수있는 용의자가있는 줄이있는 짧은 파일을 줄 것입니다. 이것은 절대 안전한 필터가 아니며, 예를 들어 따옴표로 묶인 문자열 안에 물결표와 같이 허용 된 필드를 인쇄합니다. 좀 더 정확한 것을 원한다면 Text::CSV을 사용할 수 있지만 깨진 CSV 데이터의 경우 다른 어려움이 있습니다.

더 좋은 (자동) 방법이있을 수 있지만 입력 내용이 무엇인지 모르는 경우에는 실제로 추천 할 방법이 없습니다.

+0

나는 당신이 제안한대로했다. 그 결과 범인 (덤프되는 데이터베이스의 텍스트 필드) 인 두 필드를 식별 할 수있었습니다. 필자는 특정 문자열을 반드시 포함해야하는 두 개의 필드가 있으므로이 두 필드가 정규 표현식에 대해 검사 할 때까지 문자열을 수정할 수 있습니다. 많은 감사합니다. – simone

+0

반갑습니다. – TLP

0

각 필드가 무엇인지 알고있는 경우 해당 필드 유형 (틸드 제외)과 일치하는 정규식을 작성하고 일치 항목을 캡처 한 다음 파일의 원래 문자열을 바꿀 수 있습니까?