2013-05-29 2 views
1

Я относительно новичок в программировании на Java и пытаюсь создать приложение, которое поможет некоторым коллегам.Java, как извлечь текст из большого файла и импортировать его в файл меньшего размера

Основой того, что я пытаюсь сделать, является чтение содержимого большого файла, вплоть до, возможно, более 400 000 строк, который содержит XML, но не является допустимым XML-документом, как своего рода журнал.

Что я пытаюсь сделать, это создание приложения, в котором пользователь вводит уникальный идентификатор, тогда он сканирует документ, чтобы узнать, существует ли он, если это так, и часто уникальный идентификатор происходит несколько раз в произведенном XML, то я хочу вернуться назад к идентификатору узла <documentRequestMessage>, а затем скопировать все с этого узла на его закрывающий узел и поместить его в собственный документ.

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

EDIT

К сожалению, я не смог понять, как реализовать любой из 3-х предложений до сих пор.

correId - единственная ссылка, упомянутая ранее.

текущий код у меня есть, который работает и выводит результаты на консоль, является

String correlationId = correlationID.getText(); 
BufferedReader bf = new BufferedReader(new FileReader(f)); 
System.out.println("Looking for " + correlationId); 
int lineCount = 0; 
String line; 

while ((line = bf.readLine()) != null) { 
    lineCount++; 
    int indexFound = line.indexOf(correlationId); 

    if (indexFound > -1) { 
     System.out.println("Found CorrelationID on line " + "\t" + lineCount + "\t" + line); 
    } 
} 

bf.close(); 

дальнейшей помощи признательно оценили, я не прошу кого-то написать для меня, только некоторые действительно четкие и основные инструкции :) Пожалуйста

EDIT 2

копия файла, который я пытаюсь читать и извлекать из можно найти here

+0

Вопрос - откуда вы знаете, что это недействительный XML? Можете ли вы опубликовать образец того, что «недействительно»? –

+0

@SeanBright причина, по которой я знаю, что это недействительно XML, потому что 1) XMLSpy не проверяет его. 2) Он содержит несколько (585 записей)! 3) Плюс также комментарии, которые, как я считаю, не являются правильными комментариями XML, например [2013-05-29 12: 18: 57,626] По умолчанию: 4 '' # DocumentCompositionLogger sca.component.mediation.java.Custom1322734159344 INFO - requestDocumentProductionPackG02 запрос полезной нагрузки получил >>>>>> Я скопировал файл сюда, чтобы вы могли увидеть весь документ, который я пытаюсь прочитать, который можно найти здесь (http://db.tt/Sw0C4tWL) – Chris

+0

@ Предложение Гилберта кажется очень простым, можете ли вы сказать, какие проблемы у вас есть с его внедрением? – Vitaliy

ответ

1

Пока вы читаете вперед по файлу, ища свой уникальный идентификатор, держите ссылку на последние documentRequestMessage, с которыми вы сталкиваетесь. Когда вы найдете уникальный идентификатор, у вас уже будет ссылка, необходимая для извлечения сообщения.

В этом контексте «ссылка» может означать пару вещей. Поскольку вы не проходите DOM (потому что это недопустимый XML), вы, вероятно, просто сохраните позицию в файле, где находится documentRequestMessage. Если вы используете FileInputStream (или любой InputStream, где поддерживается mark), вы можете просто mark/reset сохранить и вернуться к месту в файле, где начинается ваше сообщение.

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

private static void processMessages(File file, String correlationId) 
{ 
    BufferedReader reader = null; 

    try { 
     boolean capture = false; 
     StringBuilder buffer = new StringBuilder(); 
     String lastDRM = null; 
     String line; 

     reader = new BufferedReader(new FileReader(file)); 

     while ((line = reader.readLine()) != null) { 
      String trimmed = line.trim(); 

      // Blank lines are boring 
      if (trimmed.length() == 0) { 
       continue; 
      } 

      // We only actively look for lines that start with an open 
      // bracket (after trimming) 
      if (trimmed.startsWith("[")) { 
       // Do some house keeping - if we have data in our buffer, we 
       // should check it to see if we are interested in it 
       if (buffer.length() > 0) { 
        String message = buffer.toString(); 

        // Something to note here... at this point you could 
        // create a legitimate DOM Document from 'message' if 
        // you wanted to 

        if (message.contains("documentRequestMessage")) { 
         // If the message contains 'documentRequestMessage' 
         // then we save it for later reference 
         lastDRM = message; 
        } else if (message.contains(correlationId)) { 
         // If the message contains the correlationId we are 
         // after, then print out the last message with the 
         // documentRequestMessage that we found, or an error 
         // if we never saw one. 
         if (lastDRM == null) { 
          System.out.println(
            "No documentRequestMessage found"); 
         } else { 
          System.out.println(lastDRM); 
         } 

         // In either case, we're done here 
         break; 
        } 

        buffer.setLength(0); 
        capture = false; 
       } 

       // Based on the log file, the only interesting messages are 
       // the ones that are DEBUG 
       if (trimmed.contains("DEBUG")) { 
        // Some of the debug messages have the XML declaration 
        // on the same line, and some the line after, so let's 
        // figure out which is which... 
        if (trimmed.endsWith("?>")) { 
         buffer.append(
           trimmed.substring(
            trimmed.indexOf("<?"))); 
         buffer.append("\n"); 
         capture = true; 
        } else if (trimmed.endsWith("Message:")) { 
         capture = true; 
        } else { 
         System.err.println("Can't handle line: " + trimmed); 
        } 
       } 
      } else { 
       if (capture) { 
        buffer.append(line).append("\n"); 
       } 
      } 
     } 
    } catch (IOException ex) { 
     ex.printStackTrace(System.err); 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException ex) { 
       /* Ignore */ 
      } 
     } 
    } 
} 
+0

Обновлено на основе ваших комментариев. –

0

Что вы можете сделать, это прочитать содержимое файла и искать <documentRequestMessage> элемента. Когда вы найдете один из вышеуказанных элементов, прочитайте, пока не найдете </documentRequestMessage> и сохраните его в списке, чтобы все documentRequestMessage были доступны в списке.

Вы можете перебирать этот список в конце или при добавлении в список, чтобы найти уникальный идентификатор, который вы ищете.Если вы найдете его в XML-файлах или проигнорируете.

0

Я предполагаю, что ваш журнал представляет собой серию из <documentRequestMessage> содержимого.

Не сканировать журнал вообще.

Прочитайте журнал, и каждый раз, когда вы сталкиваетесь с заголовком <documentRequestMessage>, начните сохранять содержимое этого блока <documentRequestMessage> в область блока.

Я не уверен, что вам нужно разобрать XML или просто сохранить его в виде списка строк.

Когда вы сталкиваетесь с </documentRequestMessage> прицепом, проверьте, если идентификатор блока соответствует идентификатору, который вы ищете,

Если ID спичек, напишите <documentRequestMessage> блок в выходной файл. Если идентификатор не совпадает, очистите область блока и прочитайте следующий заголовок <documentRequestMessage>.

Таким образом, в вашем файле отсутствует обратный отсчет.

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