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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрый поиск подстроки в файле 
:(
    Опции темы
regen
Дата 24.7.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день
Суть вопроса такова.. Как средствами Java можно усуществить поиск подстроки в файле? В msdos есть команда find. Она именно его и производит. Можно ли из java вызвать эту команду или как осуществить быстрой поиск в файле? Метод считать файл в буффер а потом искать в буффере - не пройдёт.. Файлов очень много в каталоге, и мне необходимо найти файлы в которых есть указанная подстрока...
Заранее спасибо за ответ. 
PM MAIL   Вверх
batigoal
Дата 24.7.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Без программного чтения реализовать поиск в файле можно только командой оси, как ты и сам сказал. Для запуска команды пользуйся 
Код

Runtime.getRuntime().exec("find ...")

, а потом анализируй в программе вывод команды.

Разумеется, следует еще не забыть о проблеме кросплатформенности, если она нужна. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
regen
Дата 24.7.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Только что попробовал.. Команда find не может найти русскоязычной подстроки.. Т.е. подстрку "Olga" найти может, а подстроку "Ольга" - нет.. Какие тогда идеи насчёт быстрого поиска? 
PM MAIL   Вверх
sergejzr
Дата 24.7.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Там всё дело в кодировке. Поиграй с ней.

Добавлено @ 12:33 
На крайний случай - пиши сам. Ищи с Stream'e. Вот тебе алгоритмов сумка smile
http://www-igm.univ-mlv.fr/~lecroq/string/index.html 


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


Нелетучий Мыш
****


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

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



Первое, что приходит на ум при решении задачи быстрого поиска - это предварительная индексация. Разумеется, это будет затратной операцией с точки зрения добавления/удаления/изменения индексируемых файлов.  

Это сообщение отредактировал(а) Lamer George - 24.7.2006, 12:46


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
tux
Дата 24.7.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Если нужен поиск по текстовым файлам, может быть пойдет такой метод:
Код

public class Find {
    private static final String DEFAULT_CHARSET = "KOI8-R";

    public static void main(String[] args) {
        String dir = "/opt/java/postgres";
        String toSearch = "версия";
        new Find().run(dir, toSearch);
    }

    private void run(String dir, String toSearch) {
        File f = new File(dir);

        if (f.isDirectory())
            doSearch(f, toSearch);
    }

    private void doSearch(File f, String toSearch) {
        File[] files = f.listFiles();

        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory())
                doSearch(files[i], toSearch);
            else {
                try {
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(
                                    new FileInputStream(files[i]),
                                    DEFAULT_CHARSET));

                    int lineNumber = 1;
                    while (true) {
                        String line = br.readLine();
                        if (line == null)
                            break;
                        else {
                            if (line.indexOf(toSearch) >= 0) {
                                System.out.println("File: "
                                        + files[i].getAbsolutePath()
                                        + ", line: " + lineNumber);
                            }
                            lineNumber++;
                        }
                    }
                    br.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
 
PM MAIL Skype GTalk Jabber YIM   Вверх
sergejzr
Дата 24.7.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(Lamer George @  24.7.2006,  10:44 Найти цитируемый пост)
Первое, что приходит на ум при решении задачи быстрого поиска - это предварительная индексация. Разумеется, это будет затратной операцией с точки зрения добавления/удаления/изменения индексируемых файлов.  

Я бы посмотрел в сторону lucene. 
Кстати для линуха (ну и винды тоже) ещё есть beagle- лучшая альтернатива гугльскому  "Desktop search".
(Моя девушка как раз сейчас разрабатывает возможность поиска и на удалённых раб.столах smile ) 


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


Шустрый
*


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

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



Да.. Поиск в текстовых файлах....Открытие всех файлов в каталоге и просмотр их... Это понятно... Другими способов нету? Алгоритмы быстрого поиска я знаю... Вот только это опять же "изобретать велосипед" на мой взгляд... 
PM MAIL   Вверх
batigoal
Дата 24.7.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Цитата(tux @  24.7.2006,  13:47 Найти цитируемый пост)
Если нужен поиск по текстовым файлам, может быть пойдет такой метод:

Ну это все-таки с чтением при каждом поиске...

Надо решить, что критичнее - время манипуляции с файлами, или время поиска в них. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
tux
Дата 24.7.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(Lamer George @  24.7.2006,  17:57 Найти цитируемый пост)
Ну это все-таки с чтением при каждом поиске...

Надо решить, что критичнее - время манипуляции с файлами, или время поиска в них.  

Ну да... Хотя и так не очень долго - по массиву 200 метров - полминуты... В общем ждем автора. 
PM MAIL Skype GTalk Jabber YIM   Вверх
regen
Дата 24.7.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообщем описываю всю предисторию:
в каталоге около 500 файлов размером в среднем по 3 метра
текстовики...
есть форма поиска...
пользователь вводит туда какую-то строку.. дальше происходит сам поиск

насчёт кроссплатформенности... конечные пользователи представители женского пола которым давно за 30... отсюда следует - только виндоус

насчёт что критичнее.. золотая середина между быстротой поиска (чтобы пользователь не ждал по полминуты перед экраном) и объёмом потребляемой памяти при этом 
PM MAIL   Вверх
tux
Дата 24.7.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Ну тогда действительно смотри в сторону Lucene. Придется периодически индексировать файлы, зато поиск очень быстрый. 
PM MAIL Skype GTalk Jabber YIM   Вверх
regen
Дата 24.7.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Lucene так Lucene.... Хорошо... Разберусь... 
Открыв ссылку увидел что это что-то из семейства апача... Ни о каком веб-сервере речи не может быть... Если что-то не понял - то извиняйте.
И ещё... Lucene индексирует сам файл? Или строки в файлах? И это делается на чьей стороне? (файлы в котором осуществляться поиск будет со временем будут обновляться (закачка с сервера)... пройдёт ли Lucene с этим?) 
PM MAIL   Вверх
sergejzr
Дата 24.7.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Беагле кстати сам индексирует по мере добавления. Там 2 версии CSharp  и ява. идентичные до этого момента. Т.е индексацию по добавлению может только Шарп (связано с нативными вызовами) 


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


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(regen @  24.7.2006,  18:42 Найти цитируемый пост)
Открыв ссылку увидел что это что-то из семейства апача... Ни о каком веб-сервере речи не может быть... 

Apache - это организация, при чем веб-вервер?

Цитата(regen @  24.7.2006,  18:42 Найти цитируемый пост)
Lucene индексирует сам файл? Или строки в файлах?

Номера строк в документах не хранит. Если нужны строки, придется искать что-то другое.   

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

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

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


 




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


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

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