Как заменть определённые символы в файле

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

RomanK
Сообщения: 17
ОС: Debian

Как заменть определённые символы в файле

Сообщение RomanK »

Пробую перевести базу с mssql на postgres.
В статье
http://wiki.postgresql.org/wiki/Microsoft_..._by_Ian_Harding
на определённом шаге надо выполнить скрипт:

Код: Выделить всё

#!/usr/pkg/bin/tclsh
set file [open tblnames r]
set flist [read -nonewline $file]
close $file
set flist [split $flist \n]
foreach f $flist {
    set file [open $f r]
    set data [read -nonewline $file]
    close $file
    regsub -all {\000} $data {} data
    regsub -all {\n} $data \\\n data
    regsub -all {~} $data \n data
    set file [open $f w]
    puts -nonewline $file $data
    close $file
}

проблема в том, что файл достаточно большой (ок. 25гб) и скрипт вылетает с ошибкой, что невозможно выделить память (ну или что-то вроде этого)
Можно ли переписать этот скрипт так, чтобы можно было обрабатывать большие файлы? Bash, python, perl или даже php, это неважно.
Спасибо.
Спасибо сказали:
Аватара пользователя
zombie
Сообщения: 539
ОС: Ubuntu 10.04 with OpenBox

Re: Как заменть определённые символы в файле

Сообщение zombie »

Если файл текстовый то можно попробовать брать по несколько строк их обрабатывать, новую партию в туже переменную. Хотя у меня явные сомнения, что кто-то решится открыть такой большой файл. Попробуйте с различными языками.
ЛИНУКСФОРУМ ДЛЯ ЛЮДЕЙ | Гугляшечка | Блог
I'm banned by /dev/random with his team.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Как заменть определённые символы в файле

Сообщение /dev/random »

Файл нужно обрабатывать поточно. С tcl не работал, поэтому пример на баше:
while read f; do
(тело цикла)
done < $file > $newfile
Спасибо сказали:
RomanK
Сообщения: 17
ОС: Debian

Re: Как заменть определённые символы в файле

Сообщение RomanK »

Я думаю, что двоичный, но надо будет маленькую таблицу экспортировать и посмотреть содержимое.
а по содержанию скрипта:

Код: Выделить всё

    regsub -all {\000} $data {} data
    regsub -all {\n} $data \\\n data
    regsub -all {~} $data \n data

я так и не понял что там на что заменяется.
\000 - это три нулевых байта ? и заменяются на пустую строку?
во второй строке переносы строк заменяются на .... переносы строк с бэкслешем?
третья замена для меня тоже не понятна, что значит {~}?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Как заменть определённые символы в файле

Сообщение /dev/random »

В таком случае не стоит заморачиваться со скриптами. Их следует использовать только если вы понимаете, что, как и почему они делают, иначе можно напороться на серьёзные проблемы. Особенно если вы пытаетесь эти скрипты переделывать.

Попробуйте другие подходы. Например этот. Или какие-нибудь готовые конвертеры.
Спасибо сказали:
RomanK
Сообщения: 17
ОС: Debian

Re: Как заменть определённые символы в файле

Сообщение RomanK »

/dev/random писал(а):
05.11.2010 23:03
В таком случае не стоит заморачиваться со скриптами. Их следует использовать только если вы понимаете, что, как и почему они делают, иначе можно напороться на серьёзные проблемы. Особенно если вы пытаетесь эти скрипты переделывать.

Попробуйте другие подходы. Например этот. Или какие-нибудь готовые конвертеры.


за ссылку спасибо (почему-то она не нагуглилась)
со скриптами тогда заморачиваться не буду.
хотя хотелось бы разобраться, для общего развития.
кстати формат файла: простой текст
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как заменть определённые символы в файле

Сообщение drBatty »

sed умеет обрабатывать файлы любой длинны, в т.ч. и двоичные. Главное, что-бы "строки" небыли-бы слишком велики (строкой считается промежуток между '\n'). sed обрабатывает текст построчно, и в памяти находится всего одна строка.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Как заменть определённые символы в файле

Сообщение sgfault »

drBatty писал(а):
06.11.2010 08:24
Главное, что-бы "строки" не были бы слишком велики.

А какой максимум?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как заменть определённые символы в файле

Сообщение watashiwa_daredeska »

sgfault писал(а):
06.11.2010 12:38
А какой максимум?
Максимум определяется размером памяти. Когда оно перестанет влезать в ОЗУ и полезет в своп, станет жутко медленно. Когда и в своп перестанет влезать, оно умрёт от нехватки памяти.
Спасибо сказали: