2017-10-19 11 views
0

제품 정보, 재고, 공급 업체 정보 등의 데이터가 포함 된 몇 가지 텍스트 파일 유형이 있으며 모두 다르게 구조화되어 있습니다.구조로 텍스트 파일 형식을 식별하는 방법은 무엇입니까?

(제품 및 주식)

2326 | 542212 | Bananas | 00023 | 1 | pack 
2326 | 297875 | Apples  | 00085 | 1 | bag 
2326 | 028371 | Pineapple | 00007 | 1 | can 
... 

: 구조 자체를 제외한 유형에 대해 다른 식별자 이러한 파일의

몇 가지 예입니다 (더 헤더 등 어떤 파일 이름 규칙이없는이) 없다 (제품 가격)

12556 Meat, pork  0098.57 
58521 Potatoes, mashed 0005.20  
43663 Chicken wings  0009.99 
... 

(공급자 및 제품 - 여기서 N은 세퍼레이터이다)

,
03038N92388N9883929 
28338N82367N2837912 
23002N23829N9339211 
... 

(제품 정보 - 행의 여러 유형)

VIN|Mom & Pops|78 Haley str. 
PIN|BLT Bagel|5.79|FRESH 
LID|0239382|283746 
... (repeats this type of info for different products) 

그리고 몇몇 다른 사람. 나는 주어진 파일이 어떤 유형인지를 식별하는 함수를 만들고 싶다. 구글은 아무런 도움이되지 않았다. 부분적으로는 어떤 검색어를 사용할 지 모르기 때문이다. 말할 필요도없이, "내용/구조별 파일 유형 식별"은 도움이되지 않습니다. jpgs, pdfs 등을 찾는 방법에 대한 결과 만 제공합니다. 비슷한 문제를 다루기 위해 다른 사람들이 작성한 코드를 보면 도움이 될 것입니다. .

각 유형에 대해 FileIdentifier 클래스를 작성한 다음 파일을 구문 분석하려고 시도하고 작동하지 않는 경우 다음 유형으로 이동하는 것이 지금까지 생각한 바가 있습니다. 하지만 그것은 오류가 발생하기 쉬운 것 같아요. 그리고 많은 정보를 하드 코딩해야합니다. 또한 다른 형식이 나오고 기존 형식과 매우 유사하지만 열에 다른 정보가 있으면 어떻게됩니까?

답변

1

일어날 수있는 파일 형식을 제한 할 수 없다면 실제로는 아무런 답이 없습니다. 이러한 형식을 설계하여 누구에게 고유 한 식별자를 부여하거나 파일의 형식을 사용자에게 묻지 않는 한 형식 식별을위한 경험적 발견 만 찾을 수 있습니다.

그렇다면 유사한 형식의 모든 인스턴스를 시도한 다음 첫 번째 일치 대신 가장 적합한 것을 선택하는 등 결과를 향상시킬 수있는 방법이 있습니다.

일반적인 접근 방식은 항상 동일합니다. 가능한 한 엄격하게 각 디코딩 시도를하고 구문뿐만 아니라 의미에 대해서도 많은 지식을 갖추고 있어야합니다. I. e. 항목에 5 개의 값 중 하나 또는 특정 범위의 숫자 만 포함될 수 있다는 것을 알고 있으면 검색에 대한 지식을 사용합니다. 또한, 구성 요소에서 strtol()을 호출하여이를 수용하고 전체 문자열을 구문 분석했는지 확인하십시오. 그렇지 않은 경우 바로 거기에서 실패하거나 "신뢰"값을 유지하고 파일에 유효하지 않은 부분이있을 경우이를 낮 춥니 다.

그러면 결국 모든 구문 분석 결과를 살펴보고 가장 높은 신뢰도 비율을 가진 구문을 선택하십시오. 그렇지 않으면 사용자에게 가장 적합한 형식을 선택하도록 요청할 수 있습니다.

PS - Unixes의 파일 명령 줄 도구는 비슷한 기능을 수행합니다. 파일의 시작 부분을보고 특정 파일 형식을 나타내는 일반적인 시퀀스를 식별합니다.