Как добавить имя .sdf файла к содержащимся в нём веществам?
Да. Не знал такого. Но более близким аналогом моему скрипту будет кодИСН писал(а):Вот хрен там.
То есть я хочу сказать - у меня, например, ни разу не так. Передаёт сырым как есть.
Код: Выделить всё
print($ARGV) and close ARGV while <>Задумывалось, чтобы скрипт добавлял в конец записей для каждого сединения в sdf-файле, перед терминатором $$$$, поле с именем файла. Тщательно я не проверял, но, вроде, так и получается.chemist писал(а):Насколько я понимаю, этот скрипт должен добавить столько строк в SDF-файл с названием этого файла, сколько записей он содержит, а не только одну в начале файла.
ИСН, Вы были совершенно правы насчет cmd. Почитал в интернете, cmd действительно сам не раскрывает wildcards, а предоставляет делать это приложениям. Утешает меня лишь то, что заблуждался, оказывается, не только я.
Переделал скрипт (новый вариант - в обменнике), может, теперь и под виндой будет работать.palek писал(а):Под Виндой - результаты я уже описывал. Под Линуксом - всё заработало для варианта *.sdf.
Вообще, хочу сказать, что SDF - очень приятный формат, простой и хорошо документированный. С ним легко делать многие вещи.
Что то не получается положить файл в обменник поэтому выложу сюда
Код: Выделить всё
#!perl
die "Usage: $0 *.sdf > all.sdf\n" unless @ARGV;
foreach $file (<@ARGV>) {
open F, '<', $file or warn("Can't open $file: $!\n"), next;
while (<F>) {
# Извлекаем из Data Header номер без скобок
# Если этот номер не нужен, то закомм. след. строку
$n = $1 if /^>/ && /\s(\d+)(?:\s|$)/;
# Закомм. след. строку, чтобы не выбрасывать старые поля <FILENAME>
next if /^>[^<]*<FILENAME>/ .. /^$/;
# Раскомм. след. строку, чтобы записывать имя файла без расширения
#$file =~ s/\.[^.]+$//;
# Перед $$$$ помещаем строки поля для <FILENAME>
s/^(\${4})/> $n <FILENAME>\n$file\n\n$1/;
# Печатаем
print;
}
close F;
}Появилась возможность и я вновь вернулся к этой проблеме.
К сожалению, последний вариант скрипта не заработал в cmd ни для *.sdf ни для отдельно взятого test.sdf файла - выдает сообщение об ошибке в строке 5. Ну, а под Линуксом всё отработало с приемлемым результатом:
Было
> <ID> (ID0001)
ID0001
$$$$
стало
> <ID> (ID0001)
ID0001
> <FILENAME>
test0001.sdf
$$$$
Что, в общем, приемлемо, хотя, по аналогии с другими полями, надо бы добавить ID и после поля <FILENAME>:
> <FILENAME> (ID0001)
test0001.sdf
$$$$
К сожалению, последний вариант скрипта не заработал в cmd ни для *.sdf ни для отдельно взятого test.sdf файла - выдает сообщение об ошибке в строке 5. Ну, а под Линуксом всё отработало с приемлемым результатом:
Было
> <ID> (ID0001)
ID0001
$$$$
стало
> <ID> (ID0001)
ID0001
> <FILENAME>
test0001.sdf
$$$$
Что, в общем, приемлемо, хотя, по аналогии с другими полями, надо бы добавить ID и после поля <FILENAME>:
> <FILENAME> (ID0001)
test0001.sdf
$$$$
Не знаю, в чем дело. У меня работает. Если хотите, можно по этому поводу пообщаться в аське (мой UIN 246573616), а то, как совершенно справедливо было замечено выше, здесь это будет не в тему.palek писал(а):последний вариант скрипта не заработал в cmd
Это - легко. Просто заменить 10-ю и 19-ю строки соответственно наpalek писал(а):надо бы добавить ID и после поля <FILENAME>
$n = $1 if /^>/ && /\s(\(\w+\))(?:\s|$)/;
s/^(\${4})/> <FILENAME> $n\n$file\n\n$1/;
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 26 гостей