2014-04-09 6 views
0

PDF에서 내 보낸 구조화되지 않은 텍스트 데이터로 작업하고 있습니다. 원본 데이터는 텍스트 형식으로 변환 된 PDF의 표에서 가져온 것이므로 남아있는 것은 일반적인 구조입니다. 내가보고있는 특정 부분은 테이블이었습니다. 문자열을 값 사이의 거리를 기준으로 열로 분할합니다.

그래서 예를 들어, 여기

A  B  C  D   E 
1  2      3 
4    6  7  

첫번째 라인 헤더를 나타내는 일부 샘플 입력되고, 다음 줄이 값이다.

간격은 (다소) 유지됩니다. 각 열 사이에는 항상 최소 두 개의 공백이 있습니다. 그러나 실제 공간의 수는 파서가 테이블 구조에 따라이를 처리하기로 결정한 방법에 따라 달라집니다.

이 행을 다음 배열로 구문 분석하려고합니다. 헤더를 먼저 파싱하여 열을 가져온 다음 나머지 줄을 파싱하는 동안 필요한 템플릿으로 사용합니다.

{"A", "B", "C", "D", "E"} 
{"1", "2", "", "", "3"} 
{"4", "", "6", "7", ""} 

이 정보 만 제공하면 정확하게 수행 할 수 있습니까?

+0

헤더를 얻으려면'split ("\\ s +")'을 사용할 수 있습니다. 하지만 두 번째 줄이 '{ "1", "2", "" ""3 "}"이 아니라 어떻게'' "1", "" "2", "", 3 "}' – ruhungry

+0

예. 하지만 여기에 더 많은 것을 얻기위한 노력을 보여줄 필요가 있습니다. – tod

+0

@ GirlyGirl 공간의 수와 (대부분) 원래의 데이터를 기반으로합니다. – MxyL

답변

0

문자열의 헤더 (A, B, ...) 인덱스를 가져 와서 가장 가까운 값을 얻기 위해 각 라인의 값 인덱스와 비교할 수 있다고 생각합니다.

public static void main(String[] args) { 
    String headerColumn = " A  B  C  D   E"; 
    String firstLine = " 1  2      3"; 
    String secondLine = " 4    6  7 "; 

    Map<Integer, String> indexHeaderMap = new HashMap<Integer, String>(); 
    // Get header indexes 
    for (int i = 0; i < headerColumn.length(); i++) { 
     String currChar = String.valueOf(headerColumn.charAt(i)); 
     if (!currChar.equals(" ")) { 
      indexHeaderMap.put(i, currChar); 
     } 
    } 

    // Parse first line 
    parseLine(firstLine, indexHeaderMap); 
    // Parse second line 
    parseLine(secondLine, indexHeaderMap); 
} 

그리고 기능 : 나는 t을 희망

Value 1 is on column A 
Value 2 is on column B 
Value 3 is on column E 
Value 4 is on column A 
Value 6 is on column C 
Value 7 is on column D 

: 여기

private static void parseLine(String pLine, Map<Integer, String> pHeaderMap) { 
    for (int i = 0; i < pLine.length(); i++) { 
     String currChar = String.valueOf(pLine.charAt(i)); 
     if (!currChar.equals(" ")) { 
      int valueColumnIndex = getNearestColumnIndex(i, pHeaderMap); 
      System.out.println("Value " + currChar + " is on column " + pHeaderMap.get(valueColumnIndex)); 
     } 
    } 
} 

private static int getNearestColumnIndex(int pIndex, 
     Map<Integer, String> pHeaderMap) { 
    int minDiff = 500; 
    int nearestColumnIndex = -1; 
    for(Map.Entry<Integer, String> mapEntry : pHeaderMap.entrySet()) { 
     int diff = Math.abs(mapEntry.getKey() - pIndex); 
     if (diff < minDiff) { 
      minDiff = diff; 
      nearestColumnIndex = mapEntry.getKey(); 
     } 
    } 

    return nearestColumnIndex; 
} 

출력의이 결과를 얻었다 그분은 당신이 기대하는 결과를 얻을만큼 충분히 도움이됩니다!