Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема поиска строки в тексте?


Автор: unkis 11.9.2004, 18:08
Ребята есть текстовый файо в котором нужно найти определённую строчку(и) текста и вывести на кансоль.

я зделал это так но работает медленно и не для любого текста.

может посоветуете как это прееделать лучше и чтобы быстро работало.

Код

package unbenannt1;
import java.io.*;
import java.util.regex.*;
import java.util.*;
import java.util.regex.*;
import java.net.*;

import java.io.*;

import java.util.*;

/**
* <p>Überschrift: </p>
* <p>Beschreibung: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Organisation: </p>
* @author unbekannt
* @version 1.0
*/

public class Unbenannt1 {

  public static void main(String[] args) throws FileNotFoundException,
     IOException {
   String s;
   String s2=new String();
String von ="<fram";
String bis="\">";

FileReader f0 = new FileReader("list[2].txt");
  BufferedReader f = new BufferedReader(f0);

int i=0;
 while ((s=f.readLine())!=null){
  s2+=s+"\n";
  }
  Pattern pVon = Pattern.compile(von);
  Pattern pBis = Pattern.compile(bis);
  Matcher mVon = pVon.matcher(s2);
  Matcher mBis = pBis.matcher(s2);
  System.out.println("rabotaet");
  while(mVon.find()&&mBis.find(mVon.start())){
    i++;
    System.out.println("Sowpodeniy " +mVon.group() + " w pozicii " + mVon.start()+"-"+(mVon.end()-1));
    System.out.println("Sowpodeniy " +mBis.group() + " w pozicii " + mBis.start()+"-"+(mBis.end()-1));
    s2.substring(mVon.end(),mBis.start());
    //System.out.println("rabotaet");
  }
  System.out.println("wsego w tekste "+i);
   f.close();
}
/* public void substrct(int von, int bis){
  System.out.println(s2.substring(von,bis));

}*/

 }


Зарания благодарен. sample.gif

Автор: sergejzr 11.9.2004, 19:09
сдаётся мне, что тормозит из за f.readline(). Особенно для больших текстов наверное. Попробуй читать сразу большими массивами.
К сож. нет примера под рукой... это делает функция read.


ПС:
Думаю ты и сам знаешь, но System.out тоже круто тормозит...

Удачи!

Автор: Domestic Cat 11.9.2004, 20:40
Вот этот вариант у меня работает в 2.5 раза быстрее чем твой smile.gif

Код

import java.io.*;
import java.util.regex.*;
import java.util.*;

public class B
{
   public static void main(String[] args) throws FileNotFoundException,
   IOException
   {
       String s;
       StringBuffer s2 = new StringBuffer("");
       String von="<";
       String bis="\">";
       RandomAccessFile raf = new RandomAccessFile(new File("list.txt"), "r");
       int i=0;
       while( (s = raf.readLine()) != null )
       {
           s2.append(s);
       }

       raf.close();
       Pattern pVon = Pattern.compile(von);
       Pattern pBis = Pattern.compile(bis);
       Matcher mVon = pVon.matcher(s2);
       Matcher mBis = pBis.matcher(s2);
       System.out.println("rabotaet");
       StringBuffer result = new StringBuffer("");
       while(mVon.find() && mBis.find(mVon.start()))
       {
           i++;
           result.append("Sowpodeniy " + mVon.group() + " w pozicii " + mVon.start() + "-" + (mVon.end() - 1) + "\n");
           result.append("Sowpodeniy " + mBis.group() + " w pozicii " + mBis.start() + "-" + (mBis.end() - 1) + "\n");
       }
       System.out.println(result);
       System.out.println("wsego w tekste "+i);
   }
}


Заметь, чтo я вывожу сразу весь результат (Сергей прав), ну и нe создаю лиших Стрингов (а у тебя )их немеренно), а использую StringBuffer.

Автор: unkis 12.9.2004, 18:17
Ребята, почему когда я пытаюсь вставить эту комануду,

Код
System.out.println(s2.substring(mVon.end(), mBis.start()));

в этот код,
Код

........
while(mVon.find() && mBis.find(mVon.start()))
  {
    i++;
    result.append("Sowpodeniy " + mVon.group() + " w pozicii " + mVon.start() + "-" + (mVon.end() - 1) + "\n");
    result.append("Sowpodeniy " + mBis.group() + " w pozicii " + mBis.start() + "-" + (mBis.end() - 1) + "\n");
    System.out.println(s2.substring(mVon.end(), mBis.start()));
  }
.......


выдаёт ошибку. Я пытаюсь получить строчку, которая находится между началом поиска и между концом поиска.
Ведь теперь мой текст находиться в s2 или ..., почему тогда программа не работает?
И как мне это реализовать.
sample.gif

Зарания благодарен.

P.s: Извените за назойливость, наверное я вас достал с глупыми вопросами.

Автор: sergejzr 13.9.2004, 01:01
Код
import java.io.*;
import java.util.regex.*;
import java.util.*;

public class B
{
 public static void main(String[] args) throws FileNotFoundException,
 IOException
 {
   String s;
   StringBuffer s2 = new StringBuffer("");
   String von="<";
   String bis="\">";
 
 
File tst=new File("C:\\list.txt");
long len=tst.length();
FileReader raf = new FileReader(tst);
char buff[]=new char[(int)len];
System.out.println("gruzhu");
raf.read(buff,0,(int)len);
   int i=0;

/*
RandomAccessFile raf = new RandomAccessFile(new File("list.txt"), "r");
   int i=0;
   while( (s = raf.readLine()) != null )
   {
     s2.append(s);
   }
*/
s2.append(buff);
System.out.println("zagruzil");
   raf.close();
   Pattern pVon = Pattern.compile(von);
   Pattern pBis = Pattern.compile(bis);
   Matcher mVon = pVon.matcher(s2);
   Matcher mBis = pBis.matcher(s2);
   System.out.println("rabotaet");
   StringBuffer result = new StringBuffer("");
   while(mVon.find() && mBis.find(mVon.start()))
   {
     i++;
    result.append("Sowpodeniy " + mVon.group() + " w pozicii " + mVon.start() + "-" + (mVon.end() - 1) + "\n");
     result.append("Sowpodeniy " + mBis.group() + " w pozicii " + mBis.start() + "-" + (mBis.end() - 1) + "\n");
   }

   System.out.println(result);
   System.out.println("wsego w tekste "+i);
 }
}


Это том что я с read имел в виду smile.gif Всё равно ты техт в память потом сваливаешь smile.gif А работае это намного(!) быстрее

Автор: unkis 13.9.2004, 13:16
Огомное всем спасибо я нашёл свою ошибку.
smile.gif smile.gif

Автор: ElectricalStorm 13.9.2004, 14:43
попробуйте вариант ... не знаю будет ли быстрее ... smile.gif

подправлен на StringBuffer smile.gif

Код

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Grep
{
private static Charset charset;
private static CharsetDecoder decoder;
private static Pattern linePattern = Pattern.compile(".*\r?\n");
private static Pattern pattern = Pattern.compile("<fram(.*)>");

private static StringBuffer sb = new StringBuffer();

static
{
 charset = Charset.forName("ISO-8859-15");
 decoder = charset.newDecoder();
}

private static StringBuffer grep(File f, CharBuffer cb)
{
 Matcher lm = linePattern.matcher(cb);
 Matcher pm = null;
 int lines = 0;
 while (lm.find())
 {
  lines++;
  CharSequence cs = lm.group();
  if (pm == null)
   pm = pattern.matcher(cs);
  else
   pm.reset(cs);
  if (pm.find())
  {
   sb.append("File:\t").append(f).append("\n");
   sb.append("Line:\t").append(lines).append("\n");
   sb.append("String:\t").append(cs).append("\n");
  }
  if (lm.end() == cb.limit())
   break;
 }

 return sb;
}

private static void grep(File f) throws IOException
{
 FileInputStream fis = new FileInputStream(f);
 FileChannel fc = fis.getChannel();

 int sz = (int) fc.size();
 MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);

 CharBuffer cb = decoder.decode(bb);
 System.out.println( grep(f, cb) );
 fc.close();
}

public static void main(String[] args)
{
 if (args.length < 1)
 {
  System.err.println("Usage: java Grep pattern file...");
  return;
 }

 File f = new File(args[0]);
 try
 {
  grep(f);
 }
 catch (IOException x)
 {
  System.err.println(f + ": " + x);
 }
}
}

Автор: sergejzr 13.9.2004, 14:52
Цитата(unkis @ 13.9.2004, 12:16)
Огомное всем спасибо я нашёл свою ошибку.


Ну так поделись решением smile.gif

Автор: Domestic Cat 13.9.2004, 15:25
Цитата(ElectricalStorm @ 13.9.2004, 05:43)
попробуйте вариант ... не знаю будет ли быстрее ..


А что, действительно быстрее? smile.gif Систем.ауты притормаживать будут

Автор: unkis 13.9.2004, 17:02
Цитата
Ну так поделись решением

Это я по поводу моего же вопроса нашёл решения.
Цитата
выдаёт ошибку. Я пытаюсь получить строчку, которая находится между началом поиска и между концом поиска.
Ведь теперь мой текст находиться в s2 или ..., почему тогда программа не работает?
И как мне это реализовать.



я просто зднлпл так:
Код

........
while(mVon.find() && mBis.find(mVon.start()))
{
 i++;
 result.append("Sowpodeniy " + mVon.group() + " w pozicii " + mVon.start() + "-" + (mVon.end() - 1) + "\n");
 result.append("Sowpodeniy " + mBis.group() + " w pozicii " + mBis.start() + "-" + (mBis.end() - 1) + "\n");

 result.append(s2.substring(mVon.end(), mBis.end()) + s2.substring(_mVon.start(),_mBis.start()+2) + "<br>");
}
.......

А потом просто выводил готовый результат.

пример взял Domestic Cat хотя
sergej.z кажется быстрея

Ещё раз всем огромное спасибо.

Автор: Domestic Cat 13.9.2004, 17:21
Цитата(sergej @ 12.9.2004, 16:01)
Это том что я с read имел в виду  Всё равно ты техт в память потом сваливаешь  А работае это намного(!) быстрее


Сделал я профайлинг - работают оба примера одинаково (разница менее 1%) нa 100 кб файлe smile.gif
Быстрее будет использовать nio, как ElectricalStorm, хотяв его вариантe лучше присоединять
стринги к буферу.

Автор: sergejzr 13.9.2004, 17:36
Цитата(Domestic @ 13.9.2004, 16:21)
работают оба примера одинаково (разница менее 1%) нa 100 кб файлe

Да, в принципе это более менее одно и тоже smile.gif просто я посчитал, что незачем стриму каждый раз окончание строки искать smile.gif. Разницу будет видно при 10 МБ и 500 файлов ( ну примерно конечно smile.gif ) А ещё попробуй строки длинной в три буквы сделать smile.gif

Вообще мне не понравилось, что ищет очень уж долго.... С такой задержкой я наверное бы с char array'ем попытался разбираться smile.gif

ОФФТОП
Кстати подсветка на форуме тоже использует подобие буффера в яваскрипт smile.gif Причём самое удобное в том, что элементы без особого труда можно заменять (например цвет поменять если конструкция изменилась) А работает так процентов на 30% быстрее чем с оператором +.
/ОФФТОП

Автор: Upir 15.9.2004, 13:24
На счет char array-я
Если без разбора, что считывать можно и так:
Код
 class FileLoader extends Thread {

     FileLoader(File f, Document doc) {
         setPriority(4);
         this.f = f;
         this.doc = doc;
     }

     public void run() {
         try {
             Reader in = new FileReader(f);
             char[] buff = new char[4096];
             int nch;
             while ((nch = in.read(buff, 0, buff.length)) != -1) {
                 doc.insertString(doc.getLength(), new String(buff, 0, nch), null);
             }
         }
         catch (IOException e) {
             System.err.println(e.toString());
         }
         catch (BadLocationException e) {
             System.err.println(e.getMessage());
         }
     }

     Document doc;
     File f;
 }

вроде быстро выходит

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)