我正在处理从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 :(得分: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
我希望这足以获得您期望的结果!