Введение
Пару дней назад мне написал знакомый студент-физик с просьбой помочь открыть данные, снятые с лабораторного оборудования в Excel и скинул мне несколько файлов странного формата .mmd. Интернет на запрос «как открыть mmd», выдавал только танцующих аниме-девочек (MikuMikuDance) и сайт разработчика mangodata, с которого нельзя было скачать нужное ПО. Конечно, с подобной проблемой столкнется далеко не каждый, но прецедент в моем лице появился, а это значит, что интернету нужна статья «Открываем MMD формат в Excel».
Пошаговое руководство
Для тех, кому надо просто открыть файл, не вдаваясь в подробности. Если вы знакомы с Google Colab, вас заинтересует только второй пункт. Писать старался максимально подробно, демонстрируя каждое действие. Перед тем как выполнять шаги, лучше прочесть руководство целиком.
1. Заходим в Google Colab
Google Colab — удобная среда выполнения кода на Python. Не пугаемся, если испугались. Навыков питониста (да и вообще программиста) от вас не требуется. Я сам не являюсь python-программистом. Использую его, только когда нужно быстро решить задачку с использованием кода.
Переходим по ссылке https://colab.research.google.com

2. Скачиваем colab-блокнот или создаем его сами
Можете скачать файл с моего Google Drive по ссылке:
https://drive.google.com/file/d/1lA3-1Z1kiVmlrUsrv-THvvrT8bRcZMHn/view?usp=sharing
Для тех, кто боится скачивать непонятные файлы из интернета, ниже будет приведён гайд по созданию такого блокнота самостоятельно.
Чтобы открыть файл MMDtoCSV.ipynb в колабе, нажимаем Загрузить в окне со скрина выше или Файл — Загрузить блокнот в основном меню.

Вы так же можете не скачивать мой файл, а просто скопировать готовый код в колаб. Для этого нажимаем +Код

Копируем в созданный блок данный код:
mmd_file_name = "file_name.mmd" # write your mmd file name here mmdfile = open(mmd_file_name,"r") mmddata = mmdfile.read() startpos = mmddata.find('"data":[[')+8 endpos = mmddata[startpos:].find(']]')+1 data = mmddata[startpos:endpos] data = data.replace('],[','\n') data = data.replace('[','') data = data.replace(']','') csvfile = open("csvfile.csv","w") csvfile.write(data) csvfile.close()
3. Загружаем в колаб свой файл и запускаем код
Перетаскиваем ваш mmd файл в окно Файлы

В форме ниже нажимаем Ок.

В самой первой строчке кода меняем название файла на своё.

Запускаем код. Для этого можно нажать Ctrl+F9.
4. Скачиваем и открываем сконвертированный файл
После выполнения кода в Файлах появится файл csvfile.csv

Если этого не произошло, обновите папку, нажав соответствующую кнопку.

Скачиваем получившийся файл и открываем его в Excel (Данные — Из CSV-файла).

5. Наслаждаемся результатом
А что мы только что сделали?
Раздел для новичков, не обладающих знаниями о форматах данных, но жаждущих получить ответ на этот вопрос.
Файл mmd на самом деле представляет данные в формате JSON-объекта. Подробнее про JSON можно почитать вот тут. Вкратце, в нашем файле хранится набор пар ключ-значение. Вот так выглядит структура обычного mmd-файла:
//пример mmd-файла { "author":"User", "recordingDevice":"Windows NT 10.0", "date":1636465537725,"sampleRate":100, "configuration":{ "decimals":null, "movingAverage":25, "mode":null, "measurementType":"continuous", "pointMeasurementNumbers":null, "diagramType":"line", "xAxis":null, "xAxisDeviceId":null, "lastMeasurement":null, "additionalYAxis":null, "radioactivityGateTime":1, "dropCounterVolume":0.05, "dropCounterTotalVolume":1 }, "channels":[{"id":1,"uid":"60-E9:63:CD:A8:07:84-1","sensor":{"id":60},"unit":"V","color":"#CC5045"},{"id":1,"uid":"60-EA:75:68:B2:3C:0A-1","sensor":{"id":60},"unit":"V","color":"#E49128"}], "data":[[0,0.005,-0.149],[0.01,-0.002,-0.134],[0.02,0.005,-0.134]], "annotations":null }
Метаданные (author, date и др.) нас в данном кейсе не интересуют. Всё, что нужно сделать — достать содержимое, хранящееся под ключом data. Заметим, что данные хранятся в двумерном массиве.
Находим в файле подстроку ‘ «data»:[[ ‘ и запоминаем ее позицию. Затем ищем первое (начиная с data:[[) вхождение подстроки ‘ ]] ‘ — две квадратные скобки подряд определяют конец двумерного массива:
startpos = mmddata.find('"data":[[')+8 endpos = mmddata[startpos:].find(']]')+1
Запоминаем все объекты двумерного массива:
data = mmddata[startpos:endpos]
Вот так выглядит содержимое переменной data:
[0,0.005,-0.149],[0.01,-0.002,-0.134],[0.02,0.005,-0.134]
Самый простой формат, в который можно перевести получившуюся последовательность — CSV. В этом формате столбцы разделяются запятыми, а строки — символом переноса строки.

Внутри одной строки в нашем файле данные уже разделены запятыми. Отделить друг от друга ряды можно, заменив ‘ ],[ ‘ на символ переноса строки ‘ \n ‘.
data = data.replace('],[','\n')
//результат [0,0.005,-0.149 0.01,-0.002,-0.134 0.02,0.005,-0.134]
Удаляем две оставшиеся по краям скобки ‘ [ ‘ и ‘ ] ‘ и сохраняем итоговый результат в формате csv.
data = data.replace('[','') data = data.replace(']','') csvfile = open("csvfile.csv","w") csvfile.write(data) csvfile.close()
Теперь можно экспортировать данные в Excel.
ссылка на оригинал статьи https://habr.com/ru/post/599335/
Добавить комментарий