2010-07-19 2 views
3

다른 소스의 엄청난 수의 거대한 csv 파일 (100M 회선 +)에 대해 날짜 형식을 자동 추측하고 깨진 시간 또는 유닉스 시간으로 변환 할 수있는 빠른 스 니펫이나 라이브러리가 필요합니다. -우표. 성공적으로 추측 된 경우 스 니펫은 날짜 형식이 파일 전체에서 변경 될 가능성이 있으므로 이후 날짜 필드의 유효성을 검사 할 수 있어야합니다.날짜 문자열의 자동 자동 추측

날짜 형식의 테스트 집합은 가변적이어야하지만 최적의 의사 결정 트리 또는 여러 주어진 날짜 형식의 컴파일러를 컴파일하는 것이 좋습니다.

나는 그런 종류의 것이 존재하지 않지만 아직 시장 조사를해야한다는 결론에 도달했다.

필자가 지금까지 살펴본 23 가지 다른 날짜 형식에 대해 getdate()를 모방하고 날짜 별 특성을 고려하여 최적화 된 버전으로 숫자 파서를 대체했습니다 ('4'에서 '9' 하루 중 1 시간 만에 10 시까 지 '3'에서 '9'로 변경)

누구나 비슷한 문제가 발생 했습니까?

+0

각 CSV 파일에는 하나의 날짜 형식 만 있습니까, 아니면 혼합되어 있습니까? –

+0

일반적으로 파일 당 하나의 형식 일 뿐이지 만 파일 전체에서 형식을 변경하는 경우가 있습니다. 데이터베이스에 대한 가져 오기가 첫 번째 9 억 8000 만 줄에 성공한 것으로 보입니다. 그 다음 4 천만 줄은 완전히 채워집니다. – hroptatyr

+2

특정 날짜 형식이 있으면 다소 어려울 것입니다. "060804"2004 년 6 월 8 일, 2004 년 8 월 6 일 (유럽) 또는 2006 년 8 월 4 일 (yymmdd)입니까? 그런 형식은 없을 수도 있지만 선택해야 할 경우 잘못 골랐을 수도 있습니다. 진행중인로드 인 경우 소스로 돌아가서 소스를 수정할 수 있는지 확인하십시오. 일회성 일이라면, 당신은 혼란스러워해야 할 것입니다. – mattmc3

답변

1

Perl 스크립트를 사용하여 수많은 소스에서 50 개가 넘는 형식으로 타임 스탬프 된 센서 데이터 (구조적으로 CSV)를 처리했습니다. 기능에 제약이 없으며 스크립트 기반이지만 합리적으로 빠르다. (회선이 ~ 60-100chars 이상인 경우) 을 구현했다. a) 백선의 처음 몇 개를 분석하고 되감기 한 다음 실행한다. . 결정 논리를위한 맥락을 구축한다. b) 행 번호 및 컨텍스트가 잘못된 라인을 내 보냅니다. ... 실행이 끝나면 문제가되는 행을 편집하여 후속 실행시 다시 삽입하도록 설정하여 "패치 됨" 오류가 없다. 즉, 모든 줄은 형식과 일치했을 것이다. c) 줄 사이의 시간차 ... 증가하는 타임 스탬프 만 허용되었습니다. d) 또한 SI 단위로 변경하는 단위 (예 : 제국)와 같은 다른 요소를 다시 형식화 할 수 있습니다. C 캠프에서 단순한 Perl은 너무 외계인이 아니지만 너무 쉽게 만들었습니다. 참고이 방법은 10/04/05와 같은 문제 (예 : DD/MM/YY 또는 MM/DD/YY)를 처리 할 수 ​​있습니다 파일에 충분한 정보가 있음

+0

좋은 의견, 코드를 공유하는 마음? 대략 10k 라인/초는 대략 내가 염두에 두었던 것입니다. 필자는 최대 64 개의 포맷 스펙을 사용하고 점진적 정제를 수행하는 코드를 생성하는 간단한 컴파일러를 시작 했으므로 결국에는 비트 마스크를 사용하여 해당 포맷 스펙이 전체 파일에서 유지된다는 것을 나타냅니다. 내 코드의 유효성을 검사하는 코드로 할 수 있습니다. – hroptatyr

+0

테스트 데이터 페이지를 얻는다면, 필자는 학습 곡선을 따라 쉽게 데모 할 수 있습니다. 원하는 데이터를 선택하기 위해 정규 표현식을 닦을 수도 있습니다. – Roaker

+0

6 개의 소스, 각각 10000 개의 라인을 선택했습니다. http://qaos.math.tu-berlin.de/~freundt/for_roaker.tar.bz2 – hroptatyr