仅将MATLAB中的数值数据从文本文件提取到矩阵中

时间:2014-06-10 03:06:05

标签: matlab

我有一个代码生成输出文件,其中包含我需要使用MATLAB分析的某些网格的信息。

输出文件如下所示。

Vertex 1  1.3 -2.1 0 {z=(1.3e+0 -2.1e+0)  mu=(1.4e-3  2.0e-3) uv=(-0.6  0.4)}
Vertex 2  1.4 -2.1 0 {z=(1.4e+0 -2.1e+0)  mu=(2.8e-3  1.5e-3) uv=(-0.6  0.4)}
Vertex 3 -1.9  1.9 0 {z=(-1.9e+0 1.9e+0) mu=(-8.9e-2  1.4e-1) uv=( 0.7 -0.2)}
.
.
.

我希望我的MATLAB代码读入此数据文件并形成包含所有数字的矩阵 按指定的顺序。

因此,我希望将上述3行处理成矩阵

 1  1.3 -2.1 0 1.3e+0 -2.1e+0  1.4e-3  2.0e-3 -0.6  0.4
 2  1.4 -2.1 0 1.4e+0 -2.1e+0  2.8e-3  1.5e-3 -0.6  0.4
 3 -1.9  1.9 0 -1.9e+0 1.9e+0 -8.9e-2  1.4e-1  0.7 -0.2

是否有一些方便的MATLAB工具/命令来执行此操作?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用textscan

示例date.txt:

Vertex 1  1.3 -2.1 0 {z=(1.3e+0 -2.1e+0)  mu=(1.4e-3  2.0e-3) uv=(-0.6  0.4)}
Vertex 2  1.4 -2.1 0 {z=(1.4e+0 -2.1e+0)  mu=(2.8e-3  1.5e-3) uv=(-0.6  0.4)}
Vertex 3 -1.9  1.9 0 {z=(-1.9e+0 1.9e+0) mu=(-8.9e-2  1.4e-1) uv=( 0.7 -0.2)}

代码:

fileID = fopen('data.txt');

C = textscan(fileID,'Vertex %f %f %f %f {z=(%f %f) mu=(%f %f) uv=(%f %f)}');

fclose(fileID);

mtxC = [C{:}];

结果:

mtxC =

    1.0000    1.3000   -2.1000         0    1.3000   -2.1000    0.0014    0.0020   -0.6000    0.4000
    2.0000    1.4000   -2.1000         0    1.4000   -2.1000    0.0028    0.0015   -0.6000    0.4000
    3.0000   -1.9000    1.9000         0   -1.9000    1.9000   -0.0890    0.1400    0.7000   -0.2000

答案 1 :(得分:0)

MATLAB选项(部分测试)

我必须用CMM做一次类似的事情,用Python很容易做到(见下文)。您可以使用MATLAB命令regexp(text, expression)来匹配获得所需内容的正则表达式。这将返回字符串数据,您可以将其保存到数据文件然后load that data file,或使用str2double转换为数字。

要使用它,首先必须将数据文件作为一系列字符串输入MATLAB。您可以使用fgetl执行此操作。

in_fid = fopen('my_input_file.txt', 'r');
out_fid = fopen('my_output_file.txt', 'w');
data = [];

line = fgetl(in_fid);
while ischar(line)
    match = regexp(line, '[+-]?\d+\.?\d*e?[+-]?\d*', 'match');  % find all matches

    % Write to text file
    fprintf(out_fid, '%s\t', match);  % write values to file with tabs between
    fprintf(out_fid, '\n');  % write a new line to the file

    % Or save to an array locally
    data = [data; str2double(match)];

    line = fgetl(in_fid);  % grab the next line
end
fclose('all');

% If you wrote to a text file, retrieve the data
data = dlmread('my_output_file.txt', 'delimiter', '\t');  % not sure about this...

请注意,这将匹配以小数点开头且没有前一个数字的数字,即.2。另请注意,这将匹配与您提供的任何文件中的模式匹配的数字,因此它是通用的。关于如何匹配浮点数,see this site(虽然为了科学记数法添加了e部分,但我稍微改了一下)。

我能够在远程计算机上测试regexpstr2double操作,看起来直接构建数据数组。我无法测试文件I / O部分,因此可能还存在一些错误。

Python选项(我最喜欢的)

我建议在Python中使用正则表达式来处理这类事情。我不得不做一次与CMM类似的事情,在Python中很容易做到这样的事情:

import re

# Make pattern to match scientific notation numbers
pattern = re.compile(r"[+-]?\d+\.?\d*e?[+-]?\d*")

with open("your_input_file.txt", "r") as in_file:
    with open("your_output_file.txt", "w") as out_file:
        for line in in_file:
            match = pattern.findall(line)  # find all matches in the line
            out_file.write("\t".join(match) + "\n")  # write the results to a line in your output

有关Python中正则表达式的详细介绍,请参阅Dive Into Python 3,我建议几乎所有人都阅读。我在你的示例文件上对此进行了测试,它给了我:

1  1.3  -2.1  0  1.3e+0  -2.1e+0  1.4e-3  2.0e-3  -0.6  0.4
2  1.4  -2.1  0  1.4e+0  -2.1e+0  2.8e-3  1.5e-3  -0.6  0.4
3  -1.9  1.9  0  -1.9e+0  1.9e+0  -8.9e-2  1.4e-1  0.7  -0.2
your_output_file.txt中的

,所以我认为它有效!最后一步是在MATLAB中只是dlmread('your_output_file.txt', 'delimeter', '\t'),你应该好好去。

如果你想获得想象力,你可以升级你的Python脚本,以便可以从输入和输出文件作为参数从命令行调用它(查看sys.argv方法),但这得到了有点复杂,只需打开脚本并手动更改文件名就很容易了。除非您需要一直在不同命名的文件上执行此操作,否则参数是一个很好的路径。 There is a good example of this here