2014-10-17 2 views
9

У меня есть .txt-файл, содержащий информацию о документе (для 1400 документов). Каждый документ имеет идентификатор, заголовок, автор, область и реферат. Пример выглядит так:.txt файл для массивов с использованием Java

.I 1 
.T 
experimental investigation of the aerodynamics of a 
wing in a slipstream . 
.A 
brenckman,m. 
.B 
j. ae. scs. 25, 1958, 324. 
.W 
experimental investigation of the aerodynamics of a 
wing in a slipstream . 
    [...] 
the specific configuration of the experiment . 

Я хочу поместить каждый из них в 5 массивов, предназначенных для каждой категории. У меня возникли проблемы с вводом заголовка и абстракции в единую позицию массива, может ли кто-нибудь сказать мне, что не так с этим кодом? То, что я пытаюсь сделать, это вставить текстовые строки в положение x после того, как «.T» будет считаться и останавливаться, когда он найдет «.A», когда это произойдет, увеличьте положение на 1, чтобы оно заполнило следующую позицию.

try{ 
    collection = new File (File location); 
    fr = new FileReader (collection); 
    br = new BufferedReader(fr); 
    String numDoc = " "; 
    int pos = 0; 
    while((numDoc=br.readLine())!=null){ 
     if(numDoc.contains(".T")){ 
      while((numDoc=br.readLine())!= null && !numDoc.contains(".A")){ 
       Title[pos] = Title[pos] + numDoc; 
       pos++; 
      } 

     } 
    } 
} 
catch(Exception e){ 
    e.printStackTrace(); 
} 

Цель состоит в том, чтобы иметь всю информацию в пределах одной строки строки. Любая помощь будет принята с благодарностью.

+4

Это отличное начало для первого вопроса :) Не могли бы вы немного разобраться и сказать * нам, что в первую очередь? В чем конкретно заключается проблема «вставки заголовка и абстракции в единую позицию массива»? – tnw

+0

Можете ли вы отправить пример одной записи в txt-файле. Одна строка с точным форматированием. – brso05

ответ

0

Поскольку вы добавляете pos каждый раз, когда вы добавляете строку не .A, эти строки не войдут в один и тот же элемент Title. Я думаю, вы хотите подождать, чтобы увеличить pos, пока не прочитаете .A-строку.

4

Серьезно, серьезно, серьезно, Objects. Объекты позволяют группировать подобные данные, и когда вы обрабатываете все эти массивы, вы действительно будете путать себя. Что еще более важно, вы будете путать следующего человека, который будет работать над вашим кодом.

Пример

public class Book { 
    private String title; 
    private String bookAbstract; 

    public Book(String title, String bookAbstract) { 
     this.title = title; 
     this.bookAbstract = bookAbstract; 
    } 
} 

Я догадался, что вы разбор книги, поэтому я создал Book класс. Концептуально это будет содержать все, что связано с книгами. Я добавил поле title для названия книги и abstract, которое, как вы догадались, является рефератом книги. Это делает ваш код концептуально намного легче потреблять, но также гораздо удобнее обслуживать. Это также делает вашу цель очень простой.

Цель состоит в том, чтобы иметь всю информацию в пределах одной строки Строка

Разбираем его, и вы можете использовать toString метод:

public String toString() { 
    return "Title=" + title + "| Abstract=" + abstract; 
} 

Ваш конкретный вопрос

Что вы делаете, это чтение до строки с .T. Как только вы нажмете эту строку, вы знаете, что когда строка содержит .A, у вас есть данные, которые вы хотите использовать. Так что, если вы читаете Docs String, вы увидите, что есть indexOf метод:

IndexOf (интермедиат ч, внутр fromIndex)

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

Это значение имеет значение fromIndex. Вы знаете, что искали (.A), и знаете, откуда вы пришли (.T).Используя эту информацию, вы можете перепрыгнуть через строку, вырезать полезные биты и передать ее в свой новый объект Book для синтаксического анализа.

+0

NB: 'abstract' зарезервировано –

+0

Извинения. Глупая ошибка. Исправлена. – christopher

+0

Спасибо за отзыв об использовании объектов, но конечной целью является вставить всю эту информацию в базу данных для упрощения манипуляций с данными. – kaozbender

5

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

while((numDoc=br.readLine())!=null){ 
    if(numDoc.contains(".T")){ 
     while((numDoc=br.readLine())!= null && !numDoc.contains(".A")){ 

Снаружи все выглядит хорошо, в этом цикле происходит то, что начинается с запугивания.

  Title[pos] = Title[pos] + numDoc; 

С вашим условии ввода, мы бы установить:

Title[0] в Title[0] + "experimental investigation of the aerodynamics of a"

Это работает только если Title [0] существует, что я не предполагаю, что это был инициализирован, но. Мы сначала рассмотрим эту проблему, правильно определив значение нулевого массива. Это будет либо ошибкой компилятора в отношении чего-то не инициализированного, а исключения исключения нулевого указателя во время выполнения. Сверху моей головы я хочу сказать ошибку компилятора.

Так или иначе, мы рассмотрим дело с нулевым названием [pos].

while((numDoc=br.readLine())!=null){ 
    if(numDoc.contains(".T")){ 
     while((numDoc=br.readLine())!= null && !numDoc.contains(".A")){ 
      if(Title[pos] != null) { 
       Title[pos] = Title[pos] + numDoc; 
      } 
      else { 
       Title[pos] = numDoc; 
      } 
      pos++; 
     } 
    } 
} 

Когда мы делаем другое прохождение игры, мы получим следующий массив значений

Название [0] = экспериментальное исследование аэродинамики

Название [1] = крыло в слитный поток.

Если это предназначено, то это нормально. Если вам нужны названия вместе, то вы перемещаете pos++ из цикла while.

while((numDoc=br.readLine())!=null){ 
    if(numDoc.contains(".T")){ 
     while((numDoc=br.readLine())!= null && !numDoc.contains(".A")){ 
      if(Title[pos] != null) { 
       Title[pos] = Title[pos] + " " + numDoc; // add a space between lines 
      } 
      else { 
       Title[pos] = numDoc; 
      } 
     } 
     pos++; 
    } 
} 

Тогда мы получим:

Название [0] = экспериментальное исследование аэродинамики крыла в воздушном потоке.

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

+0

Большое спасибо. Решите эту проблему:> – kaozbender

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