matlab - 在 MATLAB 中解析文件的最简单方法

标签 matlab text-parsing

我正在尝试使用 MATLAB 从文本文件中提取轮廓点。包含这些轮廓点的线的示例是:

Cnt-0-Pt        0/0/146/171/5/146.912065/171.618881/5.500000/0

请注意,并非每行都以字符串 Cnt-0-Pt 开头(因为这些文件中除了轮廓点之外还有其他字段),但每条轮廓点线的字段字符串中始终有一个 0,即有例如,不是轮廓点线以 Cnt-1-Pt 开头的选项。该字符串后面有一个空格和两个制表符。我想提取第二个/分隔符之后的三个整数。在此示例中,它们将是 146、171 和 5。最直接的方法是什么?

这是文本文件的示例

#
# Direction U 
#
U-Number        92
U-Scale         1.470000
#
# Direction V 
#
V-Number        204
V-Scale         1.470000
#
# Direction W 
#
W-Number        16
W-Scale         1.470000
s-base-plane        0
#
#  Video/Recorder Parameters
#
play-mode        toggle
rotate-mode         ObjAxis
d-xrotate       0.000
d-yrotate       0.000
d-zrotate       0.000
#
#  Cut-Oblique Parameters
#
Plane-size      1.470
Plane-2D        off
Plane-3D        off
#
#  ValidVol Parameters
#
validity-field      ignored
#
#  Histogram Parameters
#
histo-scale         1.000000
#
#  VOI Parameters
#
Margin-Mode         2
#
#  VOI Segmentations
#
Slice-Dist-U        0.562500
Slice-Dist-V        0.562500
Slice-Dist-W        3.000000
MVol_Volume         0
#Contour 0 Parameter 
Contour-Start    0
Cnt-0-Contour-name      Prostate
Cnt-0-Contour-color-list        16711680
Cnt-0-Contour-color         16711680
Cnt-0-Contour-Type      0
Cnt-0-Contour-Class         0
Cnt-0-Contour-Mandatory         1
Cnt-0-Contour-num       19
Cnt-0-Inter-Contour-color       12517376
Cnt-0-Segmentation_U        No
Cnt-0-Segmentation_V        No
Cnt-0-Segmentation_W        Yes
Cnt-0-Cnt       919.658969/118.184765/919.658969/118.184765/5
Cnt-0-Pt        0/0/146/171/5/146.912065/171.618881/5.500000/0
Cnt-0-Pt        0/0/148/154/5/148.514670/154.791536/5.500000/0
Cnt-0-Pt        0/0/153/146/5/153.055382/146.511414/5.500000/0
Cnt-0-Pt        0/0/165/139/5/165.876216/139.299695/5.500000/0
Cnt-0-Pt        0/0/178/140/5/178.429949/140.635199/5.500000/0
Cnt-0-Pt        0/0/188/143/5/188.045574/143.306206/5.500000/0
Cnt-0-Pt        0/0/195/152/5/195.524394/152.921831/5.500000/0
Cnt-0-Pt        0/0/203/164/5/203.804516/164.140061/5.500000/0
Cnt-0-Pt        0/0/206/178/5/206.475523/178.563499/5.500000/0
Cnt-0-Pt        0/0/206/191/5/206.475523/191.384333/5.500000/0
Cnt-0-Pt        0/0/204/201/5/204.338717/201.267059/5.500000/0
Cnt-0-Pt        0/0/199/208/5/199.530904/208.745879/5.500000/0
Cnt-0-Pt        0/0/193/213/5/193.387588/213.553691/5.500000/0
Cnt-0-Pt        0/0/186/213/5/186.175869/213.820792/5.500000/0
Cnt-0-Pt        0/0/180/206/5/180.833855/206.876174/5.500000/0
Cnt-0-Pt        0/0/176/198/5/176.026042/198.061851/5.500000/0
Cnt-0-Pt        0/0/169/189/5/169.348525/189.514628/5.500000/0
Cnt-0-Pt        0/0/162/182/5/162.671007/182.570010/5.500000/0
Cnt-0-Pt        0/0/152/177/5/152.254080/177.495096/5.500000/0
Cnt-0-Cnt       1210.414404/141.990846/1210.414404/141.990846/6
Cnt-0-Pt        0/0/173/139/6/173.622136/139.833897/6.500000/0
Cnt-0-Pt        0/0/181/131/6/181.368056/131.286674/6.500000/0
Cnt-0-Pt        0/0/197/129/6/197.126998/129.951171/6.500000/0
Cnt-0-Pt        0/0/207/142/6/207.009724/142.772005/6.500000/0
Cnt-0-Pt        0/0/214/153/6/214.221443/153.990234/6.500000/0

最佳答案

问题在于,您实际上拥有一个不平凡的可变行标题以及与您感兴趣的数据混合在一起的不同元素。通常,像这样的文件需要逐行解析(文件格式可能应该使用 XML 结构),但可以使用快速 textscan .

第一步是在文件中找到 'Cnt-0-Pt' 行开始的点。下面的代码使用 fgetl 一次获取一行。直到找到 'Cnt-0-Cnt' 行。然后使用 textscan 读取文件的其余部分并将相关的三列保存到元胞数组中。

fid = fopen('test.txt');
while ~strncmp(fgetl(fid),'Cnt-0-Cnt',9)
end
C = textscan(fid,'%*s%*f/%*f/%f/%f/%f/%*s','CommentStyle','Cnt-0-Cnt')
fclose(fid);

textscan 格式字符串,'%*s%*f/%*f/%f/%f/%f/%*s' 忽略第一个字符串、前两个数字以及您感兴趣的三个数字之后的所有内容。'CommentStyle' 用作一种忽略以 'Cnt 开头的任何后续行的技巧-0-Cnt'。有关更完整的详细信息,请参阅 textscan 文档。通过将所有字段名称添加到 'CommentStyle' 元胞数组中,可以避免 while 循环,例如 {'#','U -Number','U-Scale','V-Number',...}.

关于matlab - 在 MATLAB 中解析文件的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32102644/

相关文章:

r - 在 R 中解析 "continent/country/city"向量的快速方法

matlab - 如何在matlab中检测按钮的按下和释放

matlab - 如何在 matlab 中绘制 "color map"图?

C++:如何使用堆栈搜索引文

c# - 使用C#解析文本文件

parsing - 帮助解析日志文件 (ANTLR3)

matlab - (matlab) 具有 relu 和 softmax 的 MLP 不适用于小批量 SGD,并在 MNIST 数据集上产生类似的预测

matlab - matlab中的微分一致性

c++ - 如何使用 matlab 编码器在运行时初始化变量?