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

Java 根据值之间的距离将字符串拆分为列,java,pdf,split,string-parsing,Java,Pdf,Split,String Parsing,我正在处理从PDF导出的非结构化文本数据。原始数据来自转换为文本格式的PDF表格,因此剩下的只是它的一般结构。我看到的一个特别的部分曾经是一张桌子 例如,这里有一些示例输入 A B C D E 1 2 3 4 6 7 第一行表示标题,下面几行是值 幸运的是,保留了间距(在某种程度上):每列之间始终至少有两个空格。但是,实际的空格数会因解析器根据表

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

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

  A        B     C     D         E
 1        2                     3
 4              6     7    
第一行表示标题,下面几行是值

幸运的是,保留了间距(在某种程度上):每列之间始终至少有两个空格。但是,实际的空格数会因解析器根据表的结构决定如何处理而有所不同

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

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

如果只提供这些信息,是否可以准确地执行此操作?

我想您可以获得字符串中标题(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);
}

我希望这是有帮助的,足以得到你期望的结果

要获取标题,可以使用
split(\\s+”)
。但是你怎么知道第二行是
{“1”,“2”,“3”,“3”}
而不是例如
{“1”,“2”,“3”}
是的。但是你需要展示你的努力来获得更多的东西。@GirlyGirl基于空间的数量和(大部分)原始数据。
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