【问题标题】:Reading from a text file in matlab从matlab中的文本文件中读取
【发布时间】:2013-06-13 20:16:59
【问题描述】:

我在“file.txt”中有以下格式的数据:

b0,  2,1
b1,  3,4
b2,  5,6
b3,  7,8
b4,  9,10
L0, 11, 12
L1, 13, -154
L2, 16, 18
L3,-19,-20
L4,-21,-22
L5,-23,24
L6, 25,28
L7, 27,30
L8, 31,35
L9,-38,40
b0,  0.1,89

这些数据继续以相同的顺序(即 b1、b2、b3...)直到一个很大的数字。我想以矩阵格式读取 b0...b4 的两个数字(即每行中用逗号分隔的数字)中的每一个,以便我可以对它们进行进一步的计算。基本上每个 b0 在“file.txt”中每 15 行出现一次,依此类推,对于 b1、b2、b3、b4。我尝试使用一些带有“textscan”的示例代码,但不幸的是我收到了错误。任何帮助将非常感激。谢谢!

【问题讨论】:

  • 我会做一个查找替换来删除所有空格(空格、制表符等)。我认为这是一个分隔符问题。
  • 文件总共有多少行?

标签: matlab


【解决方案1】:

打开文件,并使用适当的转换说明符读取每一列。

fileID = fopen('scan1.txt');
C = textscan(fileID, '%s %s %f32 %d8 %u %f %f %s %f');
fclose(fileID);
celldisp(C)

看到它:

Documentation Center

【讨论】:

  • 感谢您的回复...但我需要存储每 15 行数据。你能帮忙吗?谢谢!
【解决方案2】:

这是我的方法。在 MATLAB 中使用 for 循环很糟糕,但我发现每当我使用单元格时,我都会被抓住。可能有更好的方法可以做到这一点,但这似乎适用于您提供给我的数据。

f = fopen('data.txt');
a = textscan(f, '%s', 'Delimiter', ',');
names  = [];
vals_a = [];
vals_b = [];
for i = 1:3:numel(a{1})
    names  = [names;  a{1}{i+0}];
    vals_a = [vals_a; str2num(a{1}{i+1})];
    vals_b = [vals_b; str2num(a{1}{i+2})];
end
fclose(f);

【讨论】:

  • 感谢您的回复...但我需要 vals_a, vals_b 用于一个矩阵中的 b0 和相同的 b1 b2 b3 b4 在其他 4 个矩阵中。 b0 的每个值在 file.txt 中每 15 行出现一次,其他四个相同 - b1 b2 b3 b4。你能为此提出一些建议吗?非常感谢!
  • 一旦你导入数据,你可以毫不费力地提取你想要的部分,比如:b2_avals = vals_a[strcmp(cellstr(names), 'b2')];
  • 或者,如果您想使用每 15 个约束,vals_a[1:15:end]
  • 嗨...正在生成的 vals_a 仅包含前 5 个值...我需要每 15 行出现一次的 b0 值矩阵(其中两个)...我希望这是有道理的......谢谢
  • @user2468702 关键是这种方法应该将文本文件中的所有值读入这三个矩阵(名称、vals_a 和 vals_b)中。如果您需要将它们重新排列成不同的矩阵,这很容易做到。但这并不是这个问题的真正意义。使用此方法,所有数字都应在 MATLAB 中正确解析并可用。如果您想问另一个关于如何从这些矩阵中提取数据并以其他方式排列它们的问题,请随时作为单独的问题提出。
【解决方案3】:

由于您有逗号分隔的值,您需要更改textscan 使用的分隔符。要将这两个数字组合成一个数组,您可以使用 CollectOutput 选项:

fid = fopen('sample.txt');
C = textscan(fid, '%s %f %f', 'Delimiter', ',', 'CollectOutput', true);
fclose(fid);

提取所有b0 字段:

values = C{2}(strcmp(C{1}, 'b0'), :);

并提取所有以b0, ..., b4开头的行的值

values = C{2}(ismember(C{1}, {'b0', 'b1', 'b2', 'b3', 'b4'}), :);

【讨论】:

  • 嗨..这是为值生成一个空的 0x2 矩阵..我相信
  • @user2468702 奇怪,我将您的示例数据粘贴到一个文件中,它工作得很好。数据是否与您尝试读取的文件有任何不同?
【解决方案4】:

除了textscan,您还可以使用importdata(不过textscan 可能更快):

content = importdata('Samp.txt');

然后content.rowheaders 将包含标签(当然是重复的)。而content.data封装了所有的数字:

Data = content.data;

然后使用mat2cellreshape 就可以了:

Grouped = mat2cell(Data, ones(size(Data,1),1));

这样,您将合并单元格中每个标签的数据。然后使用:

Mat = reshape(Grouped, [15 size(Data,1)/15]);

Mat 将是一个以排序方式包含整个数据的元胞数组。 Mat{1,:} 是所有出现的b0 数据(或使用Mat(1,:) 获取所有b0 数据的元胞数组)。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多