Тема не совсем, конечно, музыкальная... Но очень щекотливая и красноглазая))
Если вы не знакомы с данной тематикой, то все написанное ниже может показаться вам китайской грамотой или бредом с ума сшедшего:)
Случилось так, что для успешного продвижения моей девушки к сдаче и защите диплома ей понадобилось провести анализ базы даннных анкет и как результат - составить 248 (!!!) таблиц. ))))
Звучит очень сурово, безусловно. Но она, как и я, в самых не подходящих случаях, не ищет легких путей. )
Суть работы вот в чем.
Имеется электронная таблица, в которой находятся ответы на вопросы анткеты 100 респондентов и 62 поля, каждое из которых содержит оценку респондентом того или иного параметра. Т.е., каждый респондент предоставляет 62 числа или значения лингвистических переменных (низко/средне/высоко, важно/не важно и т.д).
Есть 4 ключевых параметра (категории, переменные, как угодно). Это возраст, образ жизни, статус и доход. Нужно брать каждый из них по очереди как переменную, содержащую несколько категорий, и в рамках каждой из этих категорий подсчитать количество ответивших так или иначе по одному из 62 параметров. Не очень понятно, когда суть объяснена словами, по этому вот пример того, что должно быть на выходе:
| возраст | низкая | средяя | высокая | всего |
| 14-19 | 0 | 10 | 15 | 25 |
| 20-29 | 3 | 7 | 2 | 10 |
| 30-39 | ... | ... | ... | ... |
| 40-49 | | | | m3 |
| 50-59 | | | | m4 |
| 60-74 | | | | m5 |
| всего | n1 | n2 | n3 | N |
Смысл таблицы в подсчете количества людей, принадлежащих своей возрастной группе, выбравших данный вариант ответа. То есть среди 14-19-летних вариант "низкая" выбрали 0 человек, "средняя" выбрали 10 человек, "высокая" - 15 человек, далее по 20-29-летним и т.д.
Всего вопросов с вариантами - 62. А помимо возраста еще 3 ключевых категории - образ жизни, статус и доход. Простейшая математика говорит, что 4х62=248.
Ну вычтем 4 таблицы, где ключевые параметры должны были бы посчитывать сами себя (ну знающие поймут, влом сказать об этом грамотно). 244 таблицы... Это не то что пздц, это очень сильно пздц.
Те, кто тесно знаком с электронными таблицами, наверняка знают, как это сделать правильно и быстро. Я же с ними практически не работаю. Да и вообще, быть может, к стыду своему, плохо знаю оффисные пакеты, хоть и студент. То есть, я конечно без труда смогу с ними разобраться, просто я ими не пользуюсь почти никогда. Дело в том, что специальность у меня техническая - механег я. Поэтому оффисным пакетам предпочитаю математические. Сначала работал в MathCAD, затем в Wolfram Mathematica, и по сей день лучше и гибче интерпретатора, чем в Mathematica, не знаю и не видал. Короче, все курсачи, которые были для меня интересны и увлекательны, я делал польностью там. Без дяди Билла и OOWriter ))
Так вот. Решили мы с Машей сначала попробовать решить задачу в OOCalc. Единственным доступным для понимания на тот момент способом решить эту задачу было применение фильтра. Те, кто им пользовался, знают, что прежде, чем отфильтровать данные, нужно создать матрицу с условиями для выборки. В нашем случае - это 2 поля: ключевой параметр и еще 1 параметр )) Инструкция гласит примерно следующее: скопипастьте шапки нужных полей, а под ними напишите необходимые условия, которые будут забиты диапазоном в DCOUNTA. Ладно, несколько таблиц сделали, потратив на это эное количество времени. Но это долго и с точки зрения нескольких технических проблем нам не подходило. Может быть и были другие решения, но на этом мой энтузиазм в изучении манов ОО иссяк.
Я подумал, что это бред. Производить такие манипуляции для составления каждой таблицы... Нахрен оно мне сдалось. Времени у нас было мало - всего чуть больше суток. Вручную обработать каждую таблицу нам не успеть.
И я решил применить свои знания в программировании. В чем же плюс? В том, что можно написать функцию, которая импортирует электронную таблицу как список списков (двумерный массив), производит необходимые посчеты, формирует готовую таблицу с простейшим оформлением (названия строк и столбцов) и экспортирует ее в отдельный файл .xls (не нашел в Mathematica возможность экспорта в .ods, но для нас было не критично). Причем готовую функцию можно засунуть в цикл так, чтобы она перебирала все параметры из 62 по очереди для каждой из 4 ключевых категорий и экспортировала каждую такую таблицу в определенное место с уникальным именем файла. Этим я и занялся.
В чем же минус? В том, что я писал код почти 24 часа с 4хчасовым перерывом на сон и редкими перерывами на еду и сиги)). Я понимаю, что для прожженых кодеров это обычное дело, но я-то не из таких, хоть мне и очень нравица это делать.
Параллельно приходилось читать маны, ибо задача лично для меня не тривиальная.
Где-то в 00:20 последнего дня мне удалось-таки получить функцию, возвращающую матрицу, в которой было все, кроме названий строк и столбцов. Т.е. голые числа. Но это уже результат. Я поехал к Маше, окрыленный первой удачей.)
Спустя примерно час я добавил к голой матрице на выходе названия строк и столбцов. Осталось лишь произвести пробный экспорт одной таблицы в .xls. Если удача - то можно писать цикл и херачить все 244 таблицы. :) Экспортирую - названий столбцов и строк нет. Я, ессесно высадился. Думаю, Думаю... Дошло.
Названия строк и столбцов были забиты через опции встроенной функции, которая формирует таблицы из массивов. Думаю: "мляяяя.... "
Выходит, чтобы все было как надо, нужно в начало каждой строки с числами выходной таблицы добавлять элемент, содержащий название этой строки. То же самое нужно сделать для столбцов. Для этого пришлось кое что переписать. После этого пофиксил пару багов. Таблица экспортируется в том виде, который нужен.
Думаю: "ну все, пишу цикл и поехали". Написал. Запустил и.... пздц)))
Тут без дополнительных пояснений не обойтись, оно того стоит)
Сам по себе экспорт происходит в следующем виде:
Export["/home/.../filename.xls", table[аргументы моей функции]]
Как видно, адрес экспорта представляет собой Строку (String). Для того, чтобы каждый таблица экспортировалась в файл с уникальным именем, нужно в простейшем случае инсертить в имя файла, допустим, число, связанное с итератором цикла, значение которого преобразовывалось бы из численного в строкове с помощью функции ToString.
То есть это выглядело бы так:
(* в table[1,i,1,{кое-какой массив}] первый аргумент изменяется 4 раза, мне в лом было писать цикл по 2 итераторам, поэтому просто менял вручную и исполнял четыре цикла по очереди :) *)
For[i=1, i<=62,
Export["/home/.../"<>ToString[i]<>".xls",table[1,i,1,{кое-какой массив}]];
i++
]
Но вот ведь сучье вымя. В данном случае ToString просто конвертит i в "i")))) и цикл выдает кучу ошибок.
Мляяяяя... И что, вы думаете, мне пришлось сделать?
Как оказалось, ToString конвертит итератор i в строку только в одном случае - когда создается таблица значений вида
Table[ToString[i],{i,1,62}]
Вот так. Создан вектор, содержащий необходимое количество строк с номерами файлов вида {"1","2",...}
После этого мне пришлось строку с адресом и именем файла разбить на массив символов, инсертить в нужное место каждый элемент массива с номерами файлов, а затем заново собирать строку из массива символов.
Теперь все 62 адреса с именами файлов созданы и засунуты в отдельную переменную imena:
For[i=1, i<=62,
Export[imena[[i]],table[1,i,1,{кое-какой массив}]];
i++
]
Казалось бы - все. Запускай и радуйся. Запускаю и... печалюсь.
Первая таблица экспортировалась, как положено. В остальных - какая-то муть.
Времени уже 4 часа ночи. Я зол. Выбора нет - нужно внимательно читать весь код и отлаживать.
Пришлось по очереди с конца закоменчивать строки с кодом и проверять его работу, искать точку "безошибочности".
Нашел. Теперь искать ошибку.
Долго искал. Наконец, где-то в 5 с чем-то я нашел пять лишних символов "[]" в коде. Не важно где)) Важно, что пофиксив это, я получил полностью правильный и рабочий код. После этого для создания 248 таблиц понадобилось 18 нажатий на необходимые клавиши, и пара минут времени.
Может быть, из-за неопытности где-то и пришлось изобрести велосипед, но было жутко захватывающе и жутко интересно.
Домой поехал очень красноглазый, но очень довольный собой доморощенный самопальный кодер Рома.)))
Вот такая эпопея.
буду рад комментам
Жду в друзьях, жаль что проучившись вместе 5 лет, только сейчас узнал, что ты пишешь такие здоровские треки!
Хороший саунд
качественное сведение
а главное - треки очень яркие и необычные
+ и еще раз +
В друзья?
ИЗ франции например...пздц...ВЫ Ж РУССКИЕ ОКАЗЫВАЕТСЯ...=)))МОЛОДЦЫ!!!