【发布时间】:2013-05-16 13:04:58
【问题描述】:
我一直在研究一个令人费解的问题,该问题涉及将一个 ascii 文件读入 matlab,该文件包含 2 个不同格式的部分,第一部分还包括不同的列号。
MESH2D
MESHNAME "XXX"
E3T 1 1 29 30 1
E4Q 2 2 31 29 1 1
E4Q 3 31 2 3 32 1
...
...
...
ND 120450 5.28760039e+004 7.49260000e+004 8.05500000e+002
ND 120451 5.30560039e+004 7.49260000e+004 6.84126709e+002
ND 120452 5.32360039e+004 7.49260000e+004 6.97750000e+002
ND 120453 5.34010039e+004 7.49110000e+004 7.67000000e+002
NS 1 2 3 4 5 6 7 8 9 10
NS 11 12 13 14 15 16 17 18 19 20
NS 21 22 23 24 25 26 27 -28
BEGPARAMDEF
GM "Mesh"
我只对包含三角形并以 E3T/E4Q 开头的线以及包含三角形节点坐标并以 ND 开头的相应线感兴趣。对于三角形(E3T/E4Q 线),我只对前 4 个数字感兴趣,因此我试图做这样的事情:
fileID = fopen(test);
t1 = textscan(fileID, '%s',3);
t2 = textscan(fileID, '%s %d %d %d*[^\n]');
fclose(fileID);
所以读入表头跳转到数据然后读取第一个字符串和后面的4个数字,然后跳转到行尾重新开始。但这不起作用。我只得到一行数据,而不是文件的其余部分。另外,我不知道如何处理文件的第二部分,它以任意数量的数字开始(我当然可以手动查找并输入 matlab,但希望 matlab 自动找到格式的这种变化) .
你有什么建议吗?
干杯!
【问题讨论】:
-
似乎每一行都有一种标题,后面有一些数字。假设每个标题字符串的数字数量始终不变是否正确?
-
不,否则我会知道该怎么做。每行在“标题”之后有 5 或 6 个数字,具体取决于其 E3T 还是 E4Q。在 ND 部分,它始终是“ND # X Y Z”
-
肮脏的方式:逐行读取并使用
regexp解析行... -
我也想到了正则表达式,这就是我在这里标记它的原因。但我不能很好地处理正则表达式,并希望有一个更清洁的解决方案;)