根据值之间的距离将字符串拆分为列

时间:2014-04-09 15:05:05

标签: java pdf split string-parsing

我正在处理从PDF导出的非结构化文本数据。原始数据来自PDF中已转换为文本格式的表格,因此剩下的就是它的一般结构。我看到的一个特定部分曾经是一张桌子。

例如,这里有一些示例输入

  A        B     C     D         E
 1        2                     3
 4              6     7    

第一行表示标题,以下行是值。

幸运的是,间距保留(有点):每列之间总是至少有两个空格。但是,实际的空格数将根据解析器决定如何根据表的结构来处理它而变化。

我想将这些行解析为以下数组。我首先解析标题以获取列,然后在解析其余行时将其用作我需要的模板。

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

仅提供此信息是否可以准确地执行此操作?

1 个答案:

答案 0 :(得分: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);
}

功能:

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;
}

这是输出:

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

我希望这足以获得您期望的结果!