2015-09-10 3 views
-3

У меня есть файл с именем lol.txt, содержащий текст следующим образом:Java разбить строку из файла, java.util.NoSuchElementException ошибка

10000002$11-beta-hydroxylase deficiency$$10010331$$$$$$$$ 
10000005$17 ketosteroids urine$$10022891$$$$$$$$ 
10000007$17 ketosteroids urine decreased$$10022891$$$$$$$$ 
10000009$17 ketosteroids urine increased$$10022891$$$$$$$$ 
10000011$17 ketosteroids urine normal$$10022891$$$$$$$$ 
10000013$17,20-desmolase deficiency$$10010331$$$$$$$$ 

Im написание Java программа, которая будет извлекать содержимое файла. Ожидаемый результат заключается в следующем:

beta-hydroxylase deficiency 
ketosteroids urine 
ketosteroids urine decreased 
. 
. 

Мой код:

public class TextSplitter { 
    public static void main(String[] args) throws FileNotFoundException { 
     Scanner read = new Scanner (new File("lol.txt")); 
     read.useDelimiter("$"); 
     String var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11; 
     while (read.hasNext()) 
     { 
      var1 = read.next(); 
      var2 = read.next(); 
      var3 = read.next(); 
      var4 = read.next(); 
      var5 = read.next(); 
      var6 = read.next(); 
      var7 = read.next(); 
      var8 = read.next(); 
      var9 = read.next(); 
      var10 = read.next(); 
      var11 = read.next(); 
      System.out.println("" + var2); 
     } 
     read.close(); 
    } 
} 

ошибка:

Exception in thread "main" java.util.NoSuchElementException 
+2

Прежде всего, читайте больше о массивах и циклах, потому что ваш код выглядит не очень хорошо. – wawek

ответ

2

метод принимает регулярное выражение, а не String. $ имеет особое значение в регулярном выражении, вы должны процитировать это относиться к нему как Строка «$», у вас есть два варианта:

  • спасаясь специальные символы с \ (в Java \ представлен как \\):

    read.useDelimiter("\\$");

  • Использование Pattern#quote, что делает это для вас:

    read.useDelimiter(Pattern.quote("$"));

Я настоятельно рекомендую вам прочитать о петлях и Java, это сделает вашу жизнь проще. Пройдите через basic tutorial для получения более подробного объяснения.

0

Я предлагаю читать строки по строкам, а затем анализировать строки (например, используя String.split). Кроме того, сохранение результата в ArrayList, а не отдельные переменные:

List<String> results = new ArrayList<>(); 
while(read.hasNext()) { 
    results.add(read.nextLine().split("\\$", 3)[1]); 
} 
System.out.println(results); 

Здесь мы разделить каждую входную строку на куски, разделенных '$' и возьмите кусок # 1 (нумерация начинается с нуля).

Если вы не хотите сохранять результаты, просто напечатать их на стандартный вывод, используйте

while(read.hasNext()) { 
    System.out.println(read.nextLine().split("\\$", 3)[1]); 
} 
0

Прежде всего вам нужно бежать ваш $ характер, потому что delimiter в сканировании принимает регулярное выражение. И во-вторых, используйте список вместо списка переменных, его более гибкий.

public static void main(String[] args) throws FileNotFoundException { 
     Scanner read = new Scanner (new File("lol.txt")); 
     read.useDelimiter("//$"); 

     List<String> results = new ArrayList<>(); // JDK7++ 
     while (read.hasNext()) 
     { 
      results.add(read.next()); 
     } 
     read.close(); 
    } 

Второе преимущество ог использование списков является то, что вы будете проверять все элементы, с вашим подходом вы получите исключение, если число элементов любителя, чем число переменных.

Смежные вопросы