Я ищу количество подстроки в файле Короче говоря, файл содержит определенное количество статей, и мне нужно знать, сколько. Каждая статья начинается с: @ARTICLE{ или с @ARTICLE{(ряд целых чисел)
Полезная информация: - У меня есть 10 файлов для просмотра - Нет пустых файлов - Этот код дает мне исключение StringIndexOutOfBounds
Вот код, который у меня есть до сих пор:
//To read through all files
for(int i=1; i<=10; i++)
{
try
{
//To look through all the bib files
reader = new Scanner(new FileInputStream("C:/Assg_3-Needed-Files/Latex"+i+".bib"));
System.out.println("Reading Latex"+i+".bib->");
//To read through the whole file
while(reader.hasNextLine())
{
String line = reader.nextLine();
String articles = line.substring(1, 7);
if (line.equals("ARTICLE"))
count+=1;
}
}
catch(FileNotFoundException e)
{
System.err.println("Error opening the file Latex"+i+".bib");
}
}
System.out.print("\n"+count);
Попробуйте просто использовать String#contains
в каждой строке:
while(reader.hasNextLine()) {
String line = reader.nextLine();
if (line.contains("ARTICLE")) {
count += 1;
}
}
Это, по крайней мере, обойдет проблему необходимости брать подстроку в первую очередь. Проблема заключается в том, что в то время как совпадающие строки не должны иметь исключение за пределами границ, а строки длиннее 7 символов, которые не совпадают, строки, содержащие менее 7 символов, могут вызвать проблему.
Вы также можете использовать шаблон регулярного выражения, чтобы убедиться, что вы соответствуете ARTICLE
как отдельному слову:
while(reader.hasNextLine()) {
String line = reader.nextLine();
if (line.matches("\\bARTICLE\\b")) {
count += 1;
}
}
Это гарантирует, что вы не засчитаете строку, содержащую что-то вроде articles
, что не является вашей точной целью.
Вы можете проверить, начинается ли строка с нужной последовательности:
if (line.startsWith("ARTICLE")) {
count += 1;
}
Вы получаете StringIndexOutOfBounds из этой строки кода:
String articles = line.substring(1, 7);
Считываемая строка может быть пустой или содержать менее 7 символов. Чтобы избежать получения StringIndexOutOfBounds, у вас должна быть условная проверка, чтобы увидеть,
длина строки > 7
Кроме того, лучше использовать ответы, рекомендованные выше (например, .содержит или .начинается с)
Поскольку вы читаете строку за строкой, string.contains является хорошим выбором вместо подстроки, с другой стороны, все статьи начинаются с "@СТАТЬЯ", поэтому используйте "@СТАТЬЯ" в условии. Для проверки кода попробуйте это -
public class test {
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 10; i++) {
try {
//To look through all the bib files
Scanner reader = new Scanner(new FileInputStream("C:/Assg_3-Needed-Files/Latex" + i + ".bib"));
System.out.println("Reading Latex" + i + ".bib->");
//To read through the whole file
while (reader.hasNextLine()) {
String line = reader.nextLine();
if (line.contains("@ARTICLE")) {
count += 1;
}
}
} catch (FileNotFoundException e) {
System.err.println("Error opening the file Latex" + i + ".bib");
}
}
System.out.print("\n" + count);
} }