【问题标题】:import data from a text file in MATLAB with multiple delimiters从具有多个分隔符的 MATLAB 中的文本文件导入数据
【发布时间】:2014-10-01 18:04:37
【问题描述】:

我尝试将文本文件中的数据导入 MATLAB,它具有以下结构:

** Porosity
**
*POR *ALL
0.1500 0.0900 2*0.1300 0.1400 4*0.1500 0.2200 2*0.1500 0.0500
0.0900 0.1400 5*0.1500 0.2300 0.2600 0.0800 0.1500 0.1500 0.2400 0.1700
[...]

标题显然必须被忽略。空格是分隔符,而* 表示相同的值出现多次,如* 之前的整数所示。

不幸的是,每行的条目数各不相同。理想情况下,我想将所有值存储在一个数组中,如下所示:

por = [0.1500 0.0900 0.1300 0.1300 0.1400 0.1500 0.1500 0.1500 0.1500 0.1500 0.2200 0.1500 0.1500 ...]

可以通过textscan 命令以某种方式解决这个问题吗?该文件相当大,有几十万个值,所以我需要一个快速的解决方案;)非常感谢帮助!

【问题讨论】:

  • 到目前为止,您是否找到或尝试过任何代码,我们可以提供帮助?这将有助于获得快速、具体的解决方案。
  • 是的,您可以使用 textscan。我会使用空格作为分隔符来阅读它,然后使用正则表达式来查找所有重复的数字。我可以提供一些伪代码,但如果您发布一些您自己尝试的代码供我们提供帮助会更好。
  • 我对另一个文件的解决方案很慢,但在这种情况下,只有乘数 '2*' 和 '4*' 出现,并且这些值构成了一个定义良好的矩阵,每行的条目数一致。我先用 Excel 加载文件,将其保存为 .xlsx,然后用 xlsread 加载。然后我的代码将运行 for 和 if 循环来完成这项工作。这是一个相当费力和低效的问题解决方案。此外,现在我无法预测乘数,因此我无法将我的代码调整为新文件。我不熟悉 textscan 命令,但浏览我认为的其他帖子,这可能是一个解决方案。
  • fid = fopen('file'); data = textscan(fid,'%s','delimiter',' '); fclose(fid) 开头。那么您将不得不检查data 中的每个单元格以查找* 并构建您的数字数组

标签: matlab delimiter textscan


【解决方案1】:

直截了当(我很长时间没有使用Matlab,所以它可能不是最好的解决方案)

fid = fopen('temp.txt');
data = textscan(fid, '%s', 'delimiter', ' ');
fclose(fid);

out = convert_cells(data);

和功能

function out = convert_cells(cells)
  out = [];
  for i = 1 : size(cells{1})
     tmp = strsplit(cells{1}{i}, '*');
     num1 = str2double(tmp(1));
     if size(tmp, 2) == 2 && ~isnan(num1)
         num2 = str2double(tmp(2));
         if ~isnan(num2)
             out = [out repmat(num2, 1, num1)];
         end;
     elseif size(tmp, 2) == 1 && ~isnan(num1)
         out(end + 1) = num1;
     end;
  end;
end

【讨论】:

  • 这就像一个魅力!谢谢你。但是有两个问题:为什么要检查 num1 是否为数字?消除标题?其次,要忽略标题,我假设我可以在更高的 i 处开始 for 循环(在我的情况下为 6),对吧?
  • @DanielDüsentrieb 是的,它会检查我们那里有一个号码。如果你愿意,你可以跳过。