#java
#java
Вопрос:
У меня есть текстовый файл, записанный в следующих текстах:
18275440:Annette Nguyen:98
93840989:Mary Rochetta:87
23958632:Antoine Yung:79
23658231:Claire Coin:78
23967548:Emma Chung:69
23921664:Jung Kim:98
23793215:Harry Chiu:98
Я хочу извлечь последние двухзначные числа из каждой строки. Это мой написанный код:
for (int i = 3; i < 25; i ) {
line = inFile.nextLine();
String[] split = line.split(":");
System.out.println(split[2]);
}
И я получаю ошибку времени выполнения.
Комментарии:
1. не могли бы вы также поделиться ошибкой?
2. Цикл начинается с
i=3
whilei < 25
, потому что …. в начале текстового файла есть 3 строки «мусора», а всего 25 строк?3. Я не знаю, какую ошибку вы получаете?
4. Введите свою ошибку здесь..
5. @Джошуа Нгуен, какой-нибудь из ответов сработал для вас?
Ответ №1:
Обновите метод чтения, если вы используете Scanner
, вы можете проверить, осталось ли больше строк или нет.
while(inFile.hasNextLine()) {
line = inFile.nextLine();
String[] split = line.split(":");
System.out.println(split[2]);
}
Ответ №2:
Почему сложность for
спецификации цикла? Вы не используете i
, так зачем беспокоиться обо всем этом. Разве вы не хотите просто читать строки, пока их больше не останется? Если вы это сделаете, предполагая, что inFile
это позволит вам читать строки из него, ваш код для фактического анализа каждой строки и извлечения числа в конце кажется правильным. Вот полный (за вычетом определения класса) пример, который использует вашу логику синтаксического анализа:
public static void main(String[] args) throws IOException {
// Open the input data file
BufferedReader inFile = new BufferedReader(new FileReader("/tmp/data.txt"));
while(true) {
// Read the next line
String line = inFile.readLine();
// Break out of our loop if we've run out of lines
if (line == null)
break;
// Strip off any whitespace on the beginning and end of the line
line = line.strip();
// If the line is empty, skip it
if (line.isEmpty())
continue;
// Parse the line, and print out the third component, the two digit number at the end of the line
String[] split = line.strip().split(":");
System.out.println(split[2]);
}
}
Если есть файл /tmp/data.txt
с именем, указанным в вашем вопросе, это результат, который вы получаете из этого кода:
98
87
79
78
69
98
98
Ответ №3:
Не будьте так откровенны со своими критериями цикла. Используйте счетчик, чтобы получить нужные данные из файла, например:
int lineCounter = 0;
String line;
while (inFile.hasNextLine()) {
line = inFile.nextLine();
lineCounter ;
if (lineCounter >=3 amp;amp; lineCounter <= 24) {
String[] split = line.trim().split(":");
System.out.println(split[2]);
}
}
Ответ №4:
Я не знаю, почему ваш код выдает ошибку. Если у вас были какие-либо нежелательные строки (я вижу, что у вас есть 3 таких строки в вашем коде) в начале, просто запустите пустой сканер над ними.
Scanner scanner = new Scanner(new File("E:\file.txt"));
String[] split;
// run an empty scanner
for (int i = 1; i <= 3; i ) scanner.nextLine();
while (scanner.hasNextLine()) {
split = scanner.nextLine().split(":");
System.out.println(split[2]);
}
Если вы не знаете о таких строках, и они не соответствуют правилам строк, вы можете использовать try … catch для их устранения. Здесь я использую простое исключение. Но вы можете создать исключение, когда ваши условия не выполняются.
Предположим, ваш файл выглядит следующим образом:
1
2
3
18275440:Annette Nguyen:98
93840989:Mary Rochetta:87
23958632:Antoine Yung:79
bleh bleh bleh
23658231:Claire Coin:78
23967548:Emma Chung:69
23921664:Jung Kim:98
23793215:Harry Chiu:98
Тогда ваш код будет
Scanner scanner = new Scanner(new File("E:\file.txt"));
String[] split;
// run an empty scanner
// for (int i = 1; i <= 3; i ) scanner.nextLine();
while (scanner.hasNextLine()) {
split = scanner.nextLine().split(":");
try {
System.out.println(split[2]);
} catch (ArrayIndexOutOfBoundsException e) {
}
}
Ответ №5:
Предполагая, что вы используете Java 8, вы можете использовать более простой и менее императивный подход, используя метод строк BufferedReader, который возвращает поток:
BufferedReader reader = new BufferedReader(new FileReader("/tmp/data.txt"));
reader.lines()
.map(line -> line.split(":")[2])
.forEach(System.out::println);
Но, если подумать, вы могли бы избежать BufferedReader, используя файлы из Java NIO API:
Files.lines(Paths.get("/tmp/data.txt"))
.map(line -> line.split(":")[2])
.forEach(System.out::println);
Ответ №6:
Вы можете разделить d :[p{L}s] :
и взять второй элемент из результирующего массива. Шаблон регулярных d :[p{L}s] :
выражений означает строку цифр ( d
), за которой следует a :
, за которой, в свою очередь, следует строка из любых комбинаций букв и пробелов, за которой, в свою очередь, следует a :
public class Main {
public static void main(String[] args) {
String line = "18275440:Annette Nguyen:98";
String[] split = line.split("\d :[\p{L}\s] :");
String n = "";
if (split.length == 2) {
n = split[1].trim();
}
System.out.println(n);
}
}
Вывод:
98
Обратите внимание, что p{L}
указывается буква.