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

Поиск:

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


Опытный
**


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

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



Доброго времени суток, Господа!
Похожие вопросы тут обсуждались, но ответа для себя я так и не нашёл.
Так вот, есть текстовый файл. Можно ли прямо в нем заменить определенное слово другим словом? Если использовать временный файл, то больших проблем тут нет, а вот если работать только с данным файлом? Я пытаюсь через RandomAccessFile, но пока не получается. Может, чего полезного посоветуете?
Спасибо!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Samotnik
Дата 30.9.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


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

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



Pawl, Считай файл в буфер, измени слова, выведи результат из буфера в файл.
PM MAIL   Вверх
LSD
Дата 30.9.2011, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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   Вверх
Pawl
Дата 30.9.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @  30.9.2011,  11:35 Найти цитируемый пост)
Если слово такое же по длине(в байтах) , то проблем нет. Просто переписываешь это место.Если слово короче, то записываешь слово начиная с первой позиции старого слова, затем берешь байт следующий за последним байтом старого слова и пишешь в позицию следующую за новым словом. И так далее до конца файла. После чего соответственно уменьшаешь его длину. Плюс это все желательно делать блоками, а не побайтово.Если слово длиннее, то вначале увеличиваешь длину файла, и смещаешь данные в конец файла, а затем уже пишешь новое слово.

А можно примерчик, пожалуйста? smile

Добавлено через 2 минуты и 19 секунд
Цитата(Samotnik @  30.9.2011,  11:15 Найти цитируемый пост)
awl, Считай файл в буфер, измени слова, выведи результат из буфера в файл.

Спасибо за вариант, но это, по сути та же запись во временный файл, который находится в буфере, а хотелось бы работать НЕПОСРЕДСТВЕННО с файлом!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
LSD
Дата 30.9.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Код

    private static void move(final FileChannel file, final int startPosition, final int delta) throws IOException {
        ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
        if (delta < 0) {
            long currentPosition = startPosition;
            while (currentPosition <= file.size()) {
                file.position(currentPosition);
                buffer.rewind();
                int read = file.read(buffer);
                buffer.rewind();
                buffer.limit(read);
                file.position(currentPosition + delta);
                file.write(buffer);
                currentPosition += BUFFER_SIZE;
            }
        } else if (delta > 0) {
            throw new NotImplementedException();
        }
        file.force(false);
    }



--------------------
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   Вверх
Pawl
Дата 30.9.2011, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @  30.9.2011,  16:28 Найти цитируемый пост)
код Java

Ого, спасибо! Честно, с пакетом NIO не работал, так что пока не понял, то ли это, что мне надо... Пойму - отпишусь smile 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Pawl
Дата 1.10.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По поводу примера г-на LSD. Если я правильно понял, в нем в буфер считывается кусок данных из файла, затем маркер сдвигается на заданную величину и в файл записываются данные из того же буфера, т. е. тот же кусок данных. А можно ли в файле ЗАМЕНЯТЬ этот кусок на какой-то другой, задаваемый пользователем?


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
LSD
Дата 3.10.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Этот код просто сдвигает данные в файле начиная с указанной позиции, на указанную дельту. Вызов move(channel, 3, -2) порождает такие изменения (BUFFER_SIZE = 2 для наглядности):
Код

1234567890
1454567890
1456767890
1456789890
1456789090

После чего надо вызывать:
Код

channel.truncate(сhannel.size() - 2);

и получим:
Код

14567890


Т.е. алгоритм такой: 
- конвертируем строку в байты
- ищем байты в файле
- конвертируем слово на которое надо заменить в байты
- если слово короче
--- сдвигаем байты
--- уменьшаем длину файла
- если слово длиннее
--- увеличиваем длину файла
--- смещаем байты
- записываем новое слово начиная со смещения старого слова



--------------------
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   Вверх
Pawl
Дата 5.10.2011, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @  3.10.2011,  11:12 Найти цитируемый пост)
Т.е. алгоритм такой:

Спасибо, достаточно наглядно. Думаю, дальше разберусь сам.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Pawl
Дата 7.10.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, опрометчиво закрыл тему!
с заменой слова на слово такой же или меньшей длины разобрался, а вот с этим:
Цитата(LSD @  3.10.2011,  11:12 Найти цитируемый пост)
-- увеличиваем длину файла--- смещаем байты

не очень. Можно, пожалуйста, пример, как это сделать?  smile 

Спасибо!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
LSD
Дата 7.10.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Увеличить длину можно с помощью RandomAccessFile.setLength() (все равно, FileChannel создавать надо через него). Алгоритм сдвига байтов в конец файла такой же как и в начало, только начинать надо с конца сдвигаемой области, а не с начала.


--------------------
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   Вверх
Pawl
Дата 7.10.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @  7.10.2011,  15:03 Найти цитируемый пост)
Увеличить длину можно с помощью RandomAccessFile.setLength()

Спасибо, уже нашел ссылку на похожий пример!


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

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

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


 




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


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

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