Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Изменение содержимого текстовго файла |
Автор: ma_lover 1.11.2007, 12:21 |
Помогите решить проблем..Нужно считать инфу из текстового файла, модифицировать её и записать в другой текстовый файл..Модифицировать-поменять регистр с нижнего на верхний+провести замену некоторых символов на другие, добавить поле вычисления длины и так далее в том же духе...Пока добился того, что во второй файл пишет инфу в верхнем регистре, но..упорно не хочет заменять.И ещё подскажите, зачем в цикле while-к примеру- указывать явное соответсвие дескриптора-файлу, когда во всех книгах пишут, что они итак взаимно однозначны? пробовал без этого-не заработало, пока не поменял.Подскажите , плиз, ибо книги подробной инфы не дают. Спасибо.Ниже код: #! usr/bin/perl -w $file_in="in.txt" unless defined $file_in; $file_out="out.txt" unless defined $file_out; printf "Opening file for conversion...\n"; open(INFILE,'<',$file_in) or die ("Cannot open file: $!"); open(OUTFILE, '+>',$file_out) or die ("Can't open output file: $!"); register_change($file_in,$file_out); # Change every symbol's register to UP sub register_change{ while ($file_in=<INFILE>) { print OUTFILE $file_out=uc($file_in); $file_out=~ tr/S/T/; } } close INFILE or die ("Cannot close file: $!"); close OUTFILE or die ("Cannot close file: $!"); print "Successful conversion.\n"; |
Автор: BlackLFL 1.11.2007, 17:18 | ||
|
Автор: ma_lover 1.11.2007, 17:24 | ||
После долгих мучений справился сам вот таким образом:
|
Автор: ma_lover 1.11.2007, 18:37 |
Возник правда ещё один вопрос.Каким образом можно в строку с определённой точки в тсроке вставить набор символов и каким образом их потом подвигать по надобности? |
Автор: BlackLFL 2.11.2007, 10:48 | ||
|
Автор: ma_lover 2.11.2007, 17:48 |
Не знаю пока как substr поможет..нужно найти в файле все числа: 1 3 F0 34 0 1 итд. и к тем, который записываются только 1 символом, добавить нули, то есть так, чтобы стало: 01 03 F0 34 00 01... |
Автор: KSURi 2.11.2007, 19:00 | ||
|
Автор: ma_lover 4.11.2007, 23:16 | ||
добавляет в данном случае нули везде, даже там , где они не нужны.. |
Автор: BlackLFL 5.11.2007, 00:30 |
тогда может опишете более подробно, что Вам нужно? |
Автор: amg 5.11.2007, 09:32 | ||
Может, так?
|
Автор: ma_lover 5.11.2007, 12:16 |
amg, спасибо,Вы предложили то, что нужно, только вот ещё и шестнадцатиричные символы нужно учесть..то есть может быть строка: 1 3 А F0 34 0 1..тогда в результате она заменится на строку 01 03 0A F0 34 00 01. BlackLFL, вот более менее подробно, что требуется: нужно найти в файле все числа: 1 3 A F0 34 0 1 итд. и к тем, которые записываются только 1 символом, добавить нули, то есть так, чтобы стало: 01 03 0A F0 34 00 01... |
Автор: amg 5.11.2007, 12:33 |
Просто заменить \d на [\dA-F] (или на [\da-fA-F]). |
Автор: ma_lover 5.11.2007, 13:39 |
amg, заменил-но не сработало, никаких изменений со строкой не произошло.=-( |
Автор: amg 5.11.2007, 14:09 | ||||
Должно работать!
Добавлено через 10 минут и 55 секунд Эти три регулярки можно объединить:
|
Автор: ma_lover 5.11.2007, 14:29 |
amg, прошу прощения, всё действительно работает.Это я , по неопытности, []- опустил, с ними всё ок.Спасибо! ![]() |
Автор: ma_lover 7.11.2007, 13:19 |
Не могли бы вы подсказать, как подсчитать кол-во этих элементов "01 03 0A F0 34" в строке, игнорируя пробелы.. |
Автор: amg 7.11.2007, 13:37 | ||||
Например, так:
Прошу прощения, корректнее будет уточнить регулярное выражение (два подходящих символа, перед которыми начало строки либо пробел и после которых пробел либо конец строки)
|
Автор: ma_lover 7.11.2007, 14:13 |
не могли бы Вы пояснить значение утверждения "?:".."|", как я понял, обеспечивает одновременный учёт всех условий.. |
Автор: amg 7.11.2007, 15:01 | ||
|
Автор: ma_lover 7.11.2007, 15:44 |
amg,Спасибо большое! |
Автор: ma_lover 7.11.2007, 17:25 | ||
Такой вопрос..нужно удалить двойные пробелы из строки, точнее заменить их на одинарные. Всё было бы просто,если бы не тот факт,что нужно сделать это, начиная с определённой точки. Поэтому простая замена не годится..То есть в той же строке "01 03 0A F0 34"нужно заменить двойные пробелы на одинарные, при условии, что первый двойной пробел находится перед "01" и как раз его трогать не нужно..Пока сделал только так:
но он и первый двойной убивает=( |
Автор: ma_lover 8.11.2007, 10:17 |
amg, не понял..чем плох пример? Дело в том, что в строке могут быть какие угодно комбинации чисел, не обязательно "01". |
Автор: ma_lover 8.11.2007, 10:50 | ||||||
родился вопрос по предыдущему ответу..
каким образом Perl может подсчитать соединения и цифр и букв типа "0A" благодаря выражению "[\dA-F]{2}"? Ведь оно говорит о том, что нужно искать либо символ, либо букву, повторённую дважды..однако сочетания тоже каким-то образом учитываются..
Попробую подробнее..
Код подсчитывает количество "двойных" символов в строке:B4 DA 25 C5 02 40 1A 00 1E 00 01 00 60 01 0A Если учесть, что в [\dA-F]{2}, заключённое в квадратные скобки даёт нам класс символов, то получим, что это выражение должно искать дважды повторённую цифру или букву..Но также нужно учитывать и комбинации цифра-буква и буква-цифра, типа 1E..Судя по результату, это выражение всё же учитывает и комбинации, потому что в счётчике хранится общее количество двойных символов. Вот я бы и хотел уточнить , почему это так, может я чего-то не понимаю. |
Автор: amg 8.11.2007, 10:51 | ||
Пример плох тем, что вместо прояснения ситуации он ее еще больше запутывает. И пробовать код на такой строке бессмысленно, т.к. она, судя по условию задачи, не должна измениться. Дай, пожалуйста, несколько своих строк и что из них должно получиться. PS. Это относится к предыдущему посту Добавлено через 4 минуты и 23 секунды
|
Автор: ma_lover 8.11.2007, 11:05 | ||
Вот моя исходная строка:
Начиная,в данном случае, с С5, идут двойные пробелы, которые нужно заменить на одинарные. В то же время весь "заголовок":"14:52:44.230 00 Tx <HDLC 16><Len 40> " трогать не нужно, включая и пробел между <Len 40> и B4. Значения всего,кроме заголовка будут меняться, поэтому к ним привязываться бессмысленно. З.Ы. Получилось полно, но видно иначе было бы неясно, о чём идёт речь. |
Автор: amg 8.11.2007, 11:33 | ||
Попробуем так:
|
Автор: ma_lover 8.11.2007, 11:51 | ||||
К сожалению выкидывает ошибку:
|
Автор: amg 8.11.2007, 12:06 |
А единичка где? |
Автор: ma_lover 8.11.2007, 12:16 | ||||
C еденичкой работает, но удаляет пробелы и из заголовка, который трогать нельзя.. Кстати, какую роль играет еденичка?? Вот ещё обновлённый вариант второго вопроса,если что..
|
Автор: amg 8.11.2007, 12:50 | ||||||
|
Автор: ma_lover 8.11.2007, 13:21 |
Да, работает, спасибо! |
Автор: ma_lover 8.11.2007, 14:27 | ||
Можно только небольшое пояснение по поводу работы оператора s/ / /...Насколько пишут в книгах, он заменяет одно поле другим...то есть в нашем случае:
$1 должно была бы заменить последовательность из двух шестнадцатиричных символов с сопровождающими их пробелами..В данном случае этому препятствует символ отрицания захвата":?" или как?.Можно пояснить?. Спасибо. |
Автор: amg 8.11.2007, 15:09 | ||
|