Открываем MMD формат в Excel

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Введение

Пару дней назад мне написал знакомый студент-физик с просьбой помочь открыть данные, снятые с лабораторного оборудования в 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 в колабе, нажимаем Загрузить в окне со скрина выше или Файл - Загрузить блокнот в основном меню.

Готовый colab-блокнот
Готовый colab-блокнот

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

Копируем в созданный блок данный код:

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 файл в окно Файлы

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

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

Здесь меняем file_name на название своего файла
Здесь меняем file_name на название своего файла

Запускаем код. Для этого можно нажать Ctrl+F9.

4. Скачиваем и открываем сконвертированный файл

После выполнения кода в Файлах появится файл csvfile.csv

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

Обновить содержимое
Обновить содержимое

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

Как открыть CSV-файл в Excel
Как открыть CSV-файл в Excel

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. В этом формате столбцы разделяются запятыми, а строки - символом переноса строки.

Пример CSV-файла
Пример 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/


Интересные статьи

Интересные статьи

Часто при разговорах с клиентами мы спрашиваем, как они ведут учет различных данных и используют ли они CRM-систему? Популярный ответ — мы работаем с Excel-файлами, а пот...
Недавно мы провели первое онлайн IT-шоу, где совместили знания и юмор. Почему всё так странно? Да потому что нам не хотелось делать очередную конференцию с докладами и ответами на вопросы...
В идеале хотелось бы определить структуру С++ struct Person { std::string name; int age; bool student; } person; передать экземпляр person в метод отображения вместе с данными js...
В 1С Битрикс есть специальные сущности под названием “Информационные блоки, сокращенно (инфоблоки)“, я думаю каждый с ними знаком, но не каждый понимает, что это такое и для чего они нужны
Привет! Мы тут в QIWI открыли API приема переводов. Новый сервис должен решить сразу несколько проблем для тех, кто часто посылает (а особенно — получает) деньги именно посредством p2p-перевод...