Matlab非结构化文本读取+正则化+eval变量命名
1 任务目标
任务目标是将下面这个文件中的数据读取进入Matlab工作空间,以cell或者struct的形式存储:
"Summary": {
"Slices": 1,
"InitialPositionList": null,
"Interval_ms": 10000,
"UUID": "db9b2d37-d5f0-42ef-9bdf-95bcb9a3ab6d",
"UserName": "213",
"Depth": 2,
"PixelType": "GRAY16",
"Time": "2018-10-23 22:22:04 +0800",
"Date": "2018-10-23",
"z-step_um": 0,
"MetadataVersion": 10,
"PositionIndex": 0,
"SlicesFirst": false,
"ChContrastMin": [0],
"Width": 1024,
"PixelAspect": 1,
"MicroManagerVersion": "1.4.22",
"ROI": [
0,
0,
1024,
1024
],
"ChNames": ["Default"],
"IJType": 1,
"GridRow": 0,
"Comment": "",
"Height": 1024,
"GridColumn": 0,
"Prefix": "Untitled_1",
"PixelSize_um": 0,
"Frames": 4,
"BitDepth": 16,
"KeepShutterOpenChannels": false,
"Source": "Micro-Manager",
"Channels": 1,
"ComputerName": "213-PC",
"CustomIntervals_ms": [],
"KeepShutterOpenSlices": false,
"ChColors": [-1],
"TimeFirst": false,
"ChContrastMax": [65536],
"Positions": 1,
"Directory": "C:\\Users\\213\\Desktop\\yyt1023"
}
2 解决方案
- 把Summary括号里的东西取出来
- 用regexp函数结合正则表达式找到
’'["][_A-Za-z0-9-]*["][:][\s]'
类似“Slices”,“InitialPositionList”的位置序号 - 取两个位置间的字符串,根据冒号将左右两部分分开
- 存放进入cell或struct
3 小技巧
3.1 正则表达式
正则表达式被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
看百度百科可以知道了解它最基本的用法,正则表达式百度百科
刚开始学习会感到很复杂,这也可以利用网络上的一些在线生成正则表达式的工具,比如:
正则表达式在线生成——txt2re
一些小贴士
- *:星号表示重复,因此可以表示多个字符相连的情况
- []:括号就只能表示一个字符,但括号里可以放^,标点符号等等,很灵活
- \s:这个符号代表一个空格
3.2 分清matlab中的cell和struct数据结构
cell和struct中每个元素的数据类型都可以不同,但cell里面的数据没有名字,而struct里面的数据有名字
3.3 eval()函数
这个函数可以让你实现一些很有趣的事情,比如你想让程序运行中出现的一个字符串变成一个变量的变量名:
a = input('Please input your name: ');
b = 'good';
commands = strrep(a,'=b');
eval(commands)
假如输入XiYa,运行结果会是:
Xiya = 'good'
这个函数的作用是让一个字符串作为一条执行的语句,之后执行。