Как добавить имя .sdf файла к содержащимся в нём веществам?

Вопросы, связанные с химией вообще. Вы можете задать здесь свой вопрос, и мы постараемся на него ответить.
General chemical questions go here
Аватара пользователя
palek
Сообщения: 351
Зарегистрирован: Пн апр 03, 2006 11:14 am

Как добавить имя .sdf файла к содержащимся в нём веществам?

Сообщение palek » Чт фев 07, 2008 5:28 pm

Затрудняюсь с выбором правильного подраздела форума для этого вопроса, спрошу здесь.

Есть директория, в ней около 1000 .sdf файлов (содержат вещества, их ID номера и т.д.). Как бы к каждому веществу добавить поле с именем содержащего его .sdf файла и как бы эту процедуру сделать для всех этих файлов? Можно ли сделать такое в ISIS base?

Marxist

Сообщение Marxist » Чт фев 07, 2008 6:18 pm

Написать скрипт

Serty
Сообщения: 8177
Зарегистрирован: Пт июл 06, 2007 12:17 pm

Сообщение Serty » Чт фев 07, 2008 7:52 pm

Я как то сталкивался с такой задачей, и решил ее используя MultiEdit. Но тоже пришлось писать макрос :wink:

Marxist

Сообщение Marxist » Чт фев 07, 2008 10:00 pm

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

Аватара пользователя
palek
Сообщения: 351
Зарегистрирован: Пн апр 03, 2006 11:14 am

Сообщение palek » Пт фев 08, 2008 1:08 am

Насчёт скрипта - не силён.
Насчёт зачем это надо - собираюсь слить все .sdf файлы в один большой файл и нужно потом знать, из какого файла пришло то или иное вещество.

Аватара пользователя
amge
Сообщения: 2050
Зарегистрирован: Вт июл 31, 2007 11:42 am

Сообщение amge » Пт фев 08, 2008 8:31 am

palek писал(а):Насчёт скрипта - не силён.
Сделать скрипт несложно. В обменнике - архив с таким перл-скриптом, а также файлы, необходимые для его выполнения под виндой (на случай, если перл не стоит, в *nix перл и так должен быть). Запускать из консоли

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

perl add_filename.pl *.sdf
Если не работает или работает неправильно, пишите, поправим.

Кстати, если из 1-й строки этого скрипта убрать -i.bak и вызывать его как

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

perl add_filename.pl *.sdf > all.sdf
то получится sdf-файл, содержащий все молекулы

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Пт фев 08, 2008 10:47 am

Круто.
Я не знал, что достаточно всего лишь perl.exe и одной dllки, чтобы перл работал.
Зато знаю, как сделать из *.pl экзешник.
Правда, тот бы сам вышел размером с пол-мега, и к тому же скрыл бы от народа красоту и простоту перловского исходнега.

Marxist

Сообщение Marxist » Пт фев 08, 2008 12:42 pm

ИСН писал(а):Правда, тот бы сам вышел размером с пол-мега, и к тому же скрыл бы от народа красоту и простоту перловского исходнега.

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

#!perl -i.bak -p
$n = $1 if />\s+(\d+)/;
s/^(\${4})/> $n <FILENAME>\n$ARGV\n\n$1/;
Красоту? :shock:
Простоту? :shock: :shock: :shock:

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Пт фев 08, 2008 12:50 pm

Да, красоту и простоту. Вам не нравиццо? Мне - очень.
Язык инопланетян.

Marxist

Сообщение Marxist » Пт фев 08, 2008 12:56 pm

ИСН писал(а):Да, красоту и простоту. Вам не нравиццо? Мне - очень.
Язык инопланетян.
Вот ыменно!
предпочитаю человеческие языки.

Аватара пользователя
chemist
Сообщения: 10369
Зарегистрирован: Пн июл 26, 2004 2:14 am

Сообщение chemist » Пт фев 08, 2008 1:58 pm

palek писал(а):Насчёт скрипта - не силён.
Насчёт зачем это надо - собираюсь слить все .sdf файлы в один большой файл и нужно потом знать, из какого файла пришло то или иное вещество.
Эту задачу можно решить возможностями только ISIBASE так:
1. Создаете новую БД с полями, которые есть в SDF-файлах, заполняете форму.
2. Импортируете первый файл, полученную выборку сохраняете как список, присвоив ему имя того файла, из которого импортировали.
3. Импортируете второй файл, полученную выборку (будет состоять только из струтур 2-го файла) также сохраняете как как список, присвоив ему имя того файла, из которого импортировали (второго).
и т.д. до последнего файла. В результате Вы получите БД со всеми структурами из всех SDF-файлов, которая будет разбита на списки с названиями исходных SDF-файлов.
I D E A = A u

Аватара пользователя
palek
Сообщения: 351
Зарегистрирован: Пн апр 03, 2006 11:14 am

Сообщение palek » Пт фев 08, 2008 2:20 pm

Спасибо.

Попробовали скрипт - он, к сожалению, отказался обрабатывать *.sdf параметр, выдаёт следующее:
Can't open *.sdf: Invalid argument at add_filename.pl line 1.

Но на единичном файле отработал так как надо - имя файла появилось как поле у каждого вещества.

Аватара пользователя
amge
Сообщения: 2050
Зарегистрирован: Вт июл 31, 2007 11:42 am

Сообщение amge » Пт фев 08, 2008 2:48 pm

palek писал(а):Can't open *.sdf: Invalid argument at add_filename.pl line 1.
Странно. Command Prompt (cmd) вроде понимает маски (запускать надо именно из него).

Аватара пользователя
palek
Сообщения: 351
Зарегистрирован: Пн апр 03, 2006 11:14 am

Сообщение palek » Пт фев 08, 2008 3:24 pm

Эту задачу можно решить возможностями только ISIBASE так:
1. Создаете новую БД с полями, которые есть в SDF-файлах, заполняете форму.
2. Импортируете первый файл, полученную выборку сохраняете как список, присвоив ему имя того файла, из которого импортировали.
3. Импортируете второй файл, полученную выборку (будет состоять только из струтур 2-го файла) также сохраняете как как список, присвоив ему имя того файла, из которого импортировали (второго).
и т.д. до последнего файла. В результате Вы получите БД со всеми структурами из всех SDF-файлов, которая будет разбита на списки с названиями исходных SDF-файлов
Увы... так получается очень много однотипной ручной работы. Файлов то порядка 1000! Я считаю, что лучше потратить день но написать таки скрипт, который за минуту выполнит дневную работу.

Скрипт запускали из FARа, попробую теперь из командной строки.

Аватара пользователя
amge
Сообщения: 2050
Зарегистрирован: Вт июл 31, 2007 11:42 am

Сообщение amge » Пт фев 08, 2008 3:36 pm

palek писал(а):Я считаю, что лучше потратить день но написать таки скрипт, который за минуту выполнит дневную работу.
Если хотите, могу немного развернуть этот скрипт, чтобы его было легче понимать/править.

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Пт фев 08, 2008 3:42 pm

palek, в фаре командная строка та же самая, не игрушечная.
amge, мобыть я чего-то не понимаю, но как cmd должен врубиться, что *.sdf - не тупо параметр для скрипта (мало ли чем он питается, этот скрипт), а нечто, что надо развернуть по wildcards и пройтись по всем файлам? Он ему его так и отдаёт, сырым.

Аватара пользователя
palek
Сообщения: 351
Зарегистрирован: Пн апр 03, 2006 11:14 am

Сообщение palek » Пт фев 08, 2008 3:46 pm

Увы, из cmd то же самое.
Если хотите, могу немного развернуть этот скрипт, чтобы его было легче понимать/править
Да, пожалуйста.

Аватара пользователя
amge
Сообщения: 2050
Зарегистрирован: Вт июл 31, 2007 11:42 am

Сообщение amge » Пт фев 08, 2008 4:26 pm

ИСН писал(а):amge, мобыть я чего-то не понимаю, но как cmd должен врубиться, что *.sdf - не тупо параметр для скрипта (мало ли чем он питается, этот скрипт), а нечто, что надо развернуть по wildcards и пройтись по всем файлам? Он ему его так и отдаёт, сырым.
Любой шелл, и cmd в том числе, сначала раскрывает wildcards, затем передает команде то что получилось. А чтобы строку со звездочкой передать команде как есть, звездочку нужно заэкранировать или взять в кавычки.

Сейчас попробовал, у меня cmd звездочку раскрывает. Может, проблема в том, что очень много файлов (после раскрытия звездочки) просто не помещаются в командную строку в винда так своеобразно ругается на это? palek, попробуй на небольшом количестве файлов.

Аватара пользователя
amge
Сообщения: 2050
Зарегистрирован: Вт июл 31, 2007 11:42 am

Сообщение amge » Пт фев 08, 2008 4:41 pm

palek писал(а):Увы, из cmd то же самое.
Если хотите, могу немного развернуть этот скрипт, чтобы его было легче понимать/править
Да, пожалуйста.
Повременю чуток. Просто если вдруг дело в том, о чем я сказал выше, то скрипт надо писать совсем по-другому.

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8535
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

Сообщение ИСН » Пт фев 08, 2008 4:57 pm

amge писал(а):Любой шелл, и cmd в том числе, сначала раскрывает wildcards, затем передает команде то что получилось.
Вот хрен там.
То есть я хочу сказать - у меня, например, ни разу не так. Передаёт сырым как есть.
Пишу:

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

print "$_\n" foreach @ARGV;
Сохраняю как printarg.pl.
Теперь:

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

где-то-там>perl printarg.pl e1_1.txt e1_2.txt e1_3.txt 
e1_1.txt
e1_2.txt
e1_3.txt

где-то-там>perl printarg.pl *.txt 
*.txt

Ответить

Вернуться в «общехимические вопросы / general chemical issues»

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и 15 гостей