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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считать произвольную строку из текстового файла 
V
    Опции темы
Griphon
Дата 10.1.2009, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый вечер! Столкнулся с такой проблемой, что нужно считать произвольную строку из текстового файла. Все строки разного размера . Заранее большое Спасибо!
PM MAIL   Вверх
LSD
Дата 10.1.2009, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Читай построчно, пока не дойдешь до нужной строки. Как читать из файла построчно уже неоднократно обсуждалось, воспользуйся поиском.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Samotnik
Дата 10.1.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Griphon, RandomAccessFile ?

Это сообщение отредактировал(а) Samotnik - 10.1.2009, 19:21
PM MAIL   Вверх
Griphon
Дата 10.1.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Файл состоит из слов написаных столбиком(около 200 страниц). Количества строк я не знаю(для того чтоб их посчитать загнал все слова в ArrayList, итог- вся система несколько секунд тормозит). Я конечно могу открыть блокнот и подсчитать точное колличество  строк,в ручную, и жестко задать считывание файла до определенной но не хотелось бы, если учесть что размер файла может меняться.

 smile



Это сообщение отредактировал(а) Griphon - 10.1.2009, 21:42
PM MAIL   Вверх
LSD
Дата 11.1.2009, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Griphon @  10.1.2009,  21:37 Найти цитируемый пост)
для того чтоб их посчитать загнал все слова в ArrayList, итог- вся система несколько секунд тормозит

Для того чтобы посчитать количество строк, вовсе не обязательно их записывать в ArrayList, можно воспользоваться LineNumberReader.

А вообще непонятно, какую именно строку тебе надо считывать. И потому дать конкретный совет нельзя.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Griphon
Дата 11.1.2009, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Программирую головоломку Буримэ. 

 Бypимэ - лoгичecкaя игpa, в кoтopoй из бyкв нeкoтopoгo cлoвa нyжнo cocтaвить кaк мoжнo бoльшe дpyгиx cлoв. Ocнoвным пoкaзaтeлeм игpы являeтcя кoличecтвo бyкв в coздaнныx
cлoвax. 

Слово- задание берется из текстового файла по средством случайного выбора. 
PM MAIL   Вверх
MisterCleric
Дата 12.1.2009, 10:09 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Для начала считаешь количество строк в файле
Код

String line;
int lineCount = 0;

BufferedReader br = new BufferedReader(new FileReader(“yourFile.txt"));

while ((line = rdr.readLine()) != null) {
    lineCount++;
}


потом рандомом выбираешь номер строки
Код

int lineNumber = new Random().nextInt(lineCount);


и читаешь свое слово
Код

LineNumberReader lnr = new LineNumberReader(br);
lnr.setLineNumber(lineNumber);
String word = lnr.readLine();

Не забудь в блоке finaly позакрывать свои свои ридеры

Добавлено через 2 минуты и 13 секунд
извините за ошибки в коде...  smile 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
math64
Дата 12.1.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



LineNumberReader.setLineNumber() не изменяет положение в потоке, а только изменяет номер счётчик строк.

Если достаточно памяти, можно считать весь файл в виде одной String, а затем поделить его на строки с помощью split().
PM   Вверх
MisterCleric
Дата 12.1.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



так, я понял быстренько исправляю свою ошибку. Конечно не претендую на верность решения и оптимальность. Но эт то что я смог быстро придумать и что работает
Код

        String line = null;
        int lineCount = 0;
        BufferedReader br = null;

        try {
            br = new BufferedReader(new FileReader("c:/jboss-log4j.xml"));
            while ((line = br.readLine()) != null) {
                lineCount++;
            }
            System.out.println("lineCount: " + lineCount);
            int lineNumber = new Random().nextInt(lineCount);
            System.out.println("lineNumber: " + lineNumber);
            br = new BufferedReader(new FileReader("c:/jboss-log4j.xml"));
            while (lineNumber >= 0) {
                line = br.readLine();
                lineNumber--;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("found line: " + line);



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
math64
Дата 12.1.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



После первого цикла поток нужно закрыть.

Если не хватает памяти для всех слов можно считывать файл по строчкам и складывать слова в базу данных
PM   Вверх
Samotnik
Дата 12.1.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Griphon,  
ИМХО быстрее всего будет в БД хранить все слова
PM MAIL   Вверх
LSD
Дата 12.1.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Если файл формируется тобой - записывай в первую строку общее количество строк в файле.

Если файл формируется не тобой, пройдись 1 раз по файлу и посчитай количество строк, и запиши его, дату модификации и размер в файл <имяфайла.txt>.linecount. При последующих запусках просто проверяй наличие этого файла и его актуальность, при необходимости обновляй его.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Griphon
Дата 13.1.2009, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем большое при Большое Спасибо!!!! А файл, не мой,- приходится работать с тем что есть
PM MAIL   Вверх
math64
Дата 13.1.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Кроме lineCount, для решения задачи нужно собирать другую информацию, чтобы не придымывать свой формат её хранения, проще использовать базу данных. Можно использовать простую базу данных, написанную на java и не требующую установки.
Таблица примерно такого вида:
Код

CREATE TABLE WORDS (WORD VARCHAR(30), NUM INT, TM TIME, А INT, Б INT, ..., Я INT);

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

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

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


 




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


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

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