Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема поиска строки в тексте? 
:(
    Опции темы
unkis
  Дата 11.9.2004, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



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

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

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

Код

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


--------------------
www.unkis.com
PM MAIL WWW   Вверх
sergejzr
Дата 11.9.2004, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



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


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

Удачи!


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Domestic Cat
Дата 11.9.2004, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Вот этот вариант у меня работает в 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.

Это сообщение отредактировал(а) Domestic Cat - 11.9.2004, 20:42


--------------------

PM   Вверх
unkis
  Дата 12.9.2004, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Ребята, почему когда я пытаюсь вставить эту комануду,

Код
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: Извените за назойливость, наверное я вас достал с глупыми вопросами.



--------------------
www.unkis.com
PM MAIL WWW   Вверх
sergejzr
Дата 13.9.2004, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Код
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 А работае это намного(!) быстрее

Это сообщение отредактировал(а) sergej.z - 13.9.2004, 01:06


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
unkis
Дата 13.9.2004, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Огомное всем спасибо я нашёл свою ошибку.
smile.gif smile.gif


--------------------
www.unkis.com
PM MAIL WWW   Вверх
ElectricalStorm
Дата 13.9.2004, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



попробуйте вариант ... не знаю будет ли быстрее ... 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);
 }
}
}


Это сообщение отредактировал(а) ElectricalStorm - 13.9.2004, 19:15


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
sergejzr
Дата 13.9.2004, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



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


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



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Domestic Cat
Дата 13.9.2004, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



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


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


--------------------

PM   Вверх
unkis
Дата 13.9.2004, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



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

Это я по поводу моего же вопроса нашёл решения.
Цитата
выдаёт ошибку. Я пытаюсь получить строчку, которая находится между началом поиска и между концом поиска.
Ведь теперь мой текст находиться в 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 кажется быстрея

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


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Domestic Cat
Дата 13.9.2004, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



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


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


--------------------

PM   Вверх
sergejzr
Дата 13.9.2004, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Цитата(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% быстрее чем с оператором +.
/ОФФТОП



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Upir
Дата 15.9.2004, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 13.9.2004

Репутация: нет
Всего: нет



На счет 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;
 }

вроде быстро выходит
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0978 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.