Java 根据值之间的距离将字符串拆分为列
我正在处理从PDF导出的非结构化文本数据。原始数据来自转换为文本格式的PDF表格,因此剩下的只是它的一般结构。我看到的一个特别的部分曾经是一张桌子 例如,这里有一些示例输入Java 根据值之间的距离将字符串拆分为列,java,pdf,split,string-parsing,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
第一行表示标题,下面几行是值
幸运的是,保留了间距(在某种程度上):每列之间始终至少有两个空格。但是,实际的空格数会因解析器根据表的结构决定如何处理而有所不同
我想将这些行解析为以下数组。我将首先解析标题以获取列,然后在解析其余行时将其用作所需的模板
{"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