affine 2
0.62367 -0.40337 0.40337 0.62367 0.00 0.00 0.75
-0.37633 -0.40337 0.40337 -0.37633 1.00 0.00 0.25
scale 500
height 690
width 410
xOffset 134
yOffset 112
name Golden Dragon
从这个文本文件中,我想提取一个名为affine的数组,其宽度为2。
接下来的两行中用空格分隔的以下值是数组内部的值。
我已经能够从文本文件中读取其他变量,但似乎无法弄清楚数组。
到目前为止,这是我的代码:
public FileIfs(File path){
try (BufferedReader ifsReader = new BufferedReader(new FileReader(path))) {
String line = null;
int i = 0; int j = 0;
while((line = ifsReader.readLine()) != null) {
if (line.startsWith("name")) {
name = line.substring(4).trim();
System.out.println("Name: " + name);
}
if (line.startsWith("scale")) {
scale = Double.parseDouble(line.substring(5).trim());
System.out.println("Scale: " + scale);
}
if (line.startsWith("height")) {
height = Integer.parseInt(line.substring(6).trim());
System.out.println("Height: " + height);
}
if (line.startsWith("width")) {
width = Integer.parseInt(line.substring(5).trim());
System.out.println("Width: " + width);
}
if (line.startsWith("xOffset")) {
xOffset = Integer.parseInt(line.substring(7).trim());
System.out.println("xOffset: " + xOffset);
}
if (line.startsWith("yOffset")) {
yOffset = Integer.parseInt(line.substring(7).trim());
System.out.println("yOffset: " + yOffset);
}
if (line.startsWith("affine")) {
int arrLeng = Integer.parseInt(line.substring(6).trim());
System.out.println("Array Length: " + arrLeng);
affine = new double[arrLeng][7];
}
else {
if (line.startsWith(" ")) {
line.trim();
}
String currentLine [] = line.split("\\s+");
if (!line.trim().isEmpty()){
for (String s : currentLine) {
if (!s.trim().isEmpty()) {
affine[i][j++] = Double.parseDouble(s);
}
}
line = ifsReader.readLine();
i++;
j = 0;
}
} //end of ifelse
} //loop through every line of file
ifsReader.close();
}
catch (Exception e) {
System.out.println("could not find file");
} //end of try-catch
}
else部分中的代码是我尝试读取数组的地方。
如果有人可以帮忙,或者向我指出正确的方向,那将是很棒的。
谢谢。
最佳答案
一个可能的解决方案。它使用列表来保留数组数据。如果需要,将列表转换为真实数组很容易。
public void fileIfs(Path path) throws IOException {
try (Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)) {
// ------- read parameters -------
Pattern paramPattern = Pattern.compile("([A-Za-z]+)\\s+([\\w\\s]+)");
Matcher paramMatcher = paramPattern.matcher(lines.collect(Collectors.joining(",")));
Map<String, String> params = new HashMap<>();
while (paramMatcher.find()) {
params.put(paramMatcher.group(1), paramMatcher.group(2));
}
String name = params.get("name");
int affine = Integer.parseInt(params.get("affine"));
int scale = Integer.parseInt(params.get("scale"));
int height = Integer.parseInt(params.get("height"));
int width = Integer.parseInt(params.get("width"));
int xOffset = Integer.parseInt(params.get("xOffset"));
int yOffset = Integer.parseInt(params.get("yOffset"));
// ------- read array -------
List<List<Double>> affineList = new ArrayList<>();
Pattern arrayPattern = Pattern.compile("([\\-\\d]+\\.\\d+)");
lines.forEach(line -> {
Matcher arrayMatcher = arrayPattern.matcher(line);
List<Double> numbers = new ArrayList<>();
while (arrayMatcher.find()) {
numbers.add(Double.parseDouble(arrayMatcher.group(1)));
}
if (!numbers.isEmpty()) {
affineList.add(numbers);
}
});
// ---------------
System.out.println("params: " + params);
System.out.println("affineList: " + affineList);
}
}
输出:
params: {yOffset=112, xOffset=134, width=410, name=Golden Dragon, scale=500, affine=2, height=690}
affineList: [[0.62367, -0.40337, 0.40337, 0.62367, 0.0, 0.0, 0.75], [-0.37633, -0.40337, 0.40337, -0.37633, 1.0, 0.0, 0.25]]