Как прочитать эти данные из файла на JAVA
У меня есть такой формат данных
n
l
p1(x1) p1(x2) imp(p1)
p2(x1) p2(x2) imp(p2)
: : :
pl(x1) pl(x2) imp(pl)
r
q1(x1) q1(x2) imp(q1)
q2(x1) q2(x2) imp(q2)
: : :
qr(x1) qr(x2) imp(qr)
Где n, l (число p) и r (число q) - целые числа. Я знаю, как читать только целые числа из файла, но как я могу прочитать строки, которые включают строки и получить значения x1, x2 и p1 для каждой строки?! Спасибо заранее.
Вот мой код для чтения только целых чисел.
try {
reader = new BufferedReader(new FileReader(file));
String text = null;
while ((text = reader.readLine()) != null) {
// The first line gives the number of nodes (You will use to create the int[][] graph = new int[nOfNodes][nOfNodes];)
if (c == 0) {
numberOfNodes = Integer.parseInt(text.trim());
} // The second one gives the number of edges
else if (c == 1) {
nOfEdges = Integer.parseInt(text.trim());
graph2 = new double[nOfEdges][3];
} // And third the list of special nodes
// `nodes` will now contains only your special constrained one
else if (c == 2) {
String[] str = text.split(" ");
for (int i = 0; i < str.length; i++) {
if (str[i].trim().length() > 0) {
nodes.add(Integer.parseInt(str[i]));
}
}
} else { // Then you have your edges descriptors
String[] str = text.split(" ");
for (int i = 0; i < str.length; i++) {
if (str[i].trim().length() > 0) {
graph2[c - 4][i] = Double.parseDouble(str[i]);
}
}
}
c++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
System.out.print(e);
}
}
3 ответа:
Используя класс matcher, как это
public static int numberOfPoints = -1, p=-1, q=-1; public static void main(String[] args) throws FileNotFoundException { ArrayList<Integer> dots = new ArrayList<>(); int c = 0; File file = new File("D:\\ALGORTHIMS\\MASTER LEVEL\\dr. khaled\\assignment 3\\a.txt"); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String text = null; while ((text = reader.readLine()) != null) { try { if(c==0) { numberOfPoints=Integer.parseInt(text); c=1;} if(c==1) { p=Integer.parseInt(text);c=2;} if(c==2) q=Integer.parseInt(text); } catch (NumberFormatException e) { Matcher m = Pattern.compile("\\(([^)]+)\\)").matcher(text); while (m.find()) { dots.add(Integer.parseInt(m.group(1))); } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { System.out.print(e); } }
На мой взгляд, лучше всего для вас здесь использовать класс свойств. С помощью класса properties вы можете задать некоторые свойства, а затем прочитать их снова! Это ссылка, которую я нашел, объясняет это лучше всего!
Https://www.mkyong.com/java/java-properties-file-examples/
Если вы не хотите этого, вы можете просто разделить строку на 3 строки, каждая из которых содержит один фрагмент данных.Теперь найдите открытую скобку и закрытую скобку и получите то, что есть. между ними. Я добавил + 1 и - 1, чтобы он не читал фигурные скобки, а только число между ними.String data[] = line.split(" ");
int begin = string.indexOf('('); int end = string.indexOf(')'); string.substring(begin + 1, end - 1);
Теперь просто разберите вашу строку на целое число.
int number = Integer.parseInt(thedatathatyouhave);
Быстрый поиск в google привел меня к этому учебникупо базовому Java I/O , и в частности, есть разделпо сканированию , который демонстрирует, как удобно разбить (он же "разделить" или "маркировать") ваш ввод на более мелкие части и, возможно, проанализировать их более структурированным образом.
Документациядля класса сканеров содержит более подробные примеры. Я думаю, вам нужно что-то вроде:
String input = "p1(x1) p1(x2) imp(p1)"; Scanner s = new Scanner(input); s.findInLine("(\\w+)\\((\\w+)\\) (\\w+)\\((\\w+)\\) imp\\((\\w+)\\)");
Я еще не проверял это, но в основном " \ \ ("для разбор A " ("и" \ \ w+ " предназначен для разбора любой последовательности из одного или нескольких символов. Если вы хотите разобрать последовательность цифр, то вместо этого используйте "\\d+".
Надеюсь, это поможет, удачи!