【问题标题】:Only import certain column with importdata in Matlab仅在 Matlab 中使用 importdata 导入某些列
【发布时间】:2014-07-02 12:11:48
【问题描述】:

我有一个格式化的文本文件。不知何故,当我使用 importdata 时,它会在发生 NaN 时在某些行之后停止。现在我只想导入某个列,因为我知道,不会有任何 NaN。是否可以只读取带有 importdata 的某一列或避免它在出现 NaN 后停止?

谢谢!

A B C
t1 0.1 ---
t2 -1 0
t3 0.3 ---

分隔符是单个空格。如果我将它导入 Excel,我的文本文件中的每一列在 Excel 文件中都有自己的列。 在此示例中,我只想导入 B 列,以便在 struct .data 中拥有

0
-1
0.3

【问题讨论】:

  • 与我们分享一些您的输入数据样本,以便让我们了解所使用的分隔符以及可能的预期输出。
  • 您在寻找结构输出吗?
  • 任何输出都可以,只要它返回特定列的所有行。也许它不是用单个空格格式化的,因为我尝试了textscan(fid, ' ') 并得到了错误:格式字符串格式错误。
  • 另外,A B C 是要从最终输出中省略的文本文件的第一行,对吧?
  • 而且,我认为您的示例预期输出中的第一个数字必须是 0.1 而不是 0。如果我错了,请纠正我。

标签: matlab nan text-processing


【解决方案1】:

导入数据方法

对于元胞数组输出,你可以使用这个 -

a1 = importdata(filepath,'%s') %//' filepath is the path to your text file
s1 = regexp(a1,'\s','Split')
out = cellfun(@(x) x(:,2), s1(2:end)) %// expected output as a cell array

如果你想有一个双数组作为输出,在上面的代码之后使用这个 -

out = str2double(out)

文本扫描方法

fid = fopen(filepath,'r'); %//' filepath is the path to your text file
d1 = textscan(fid,'%s %f %s','HeaderLines',1);
out = d1{1,2} %// out is expected output as a double array
fclose(fid);

编辑 1:

a1 = importdata(filepath,'%s') %//' filepath is the path to your text file
s1 = regexp(a1,'\s','Split')

s1 = s1(cellfun(@numel,s1)>1) %//' removes rows like `---` or empty lines
out = cellfun(@(x) x(:,2), s1(2:end))

out = str2double(out);
out = out(~isnan(out))  %// expected output as a double array

【讨论】:

  • 我不能做一个垂直猫,因为尺寸不一致。但我想我现在可以通过遍历所有单元格数组并捕获正确的列来修复它。
  • @Baloo 并修复了 importdata 的代码,使其也适用于不一致的尺寸!
  • 不幸的是,它并没有解决我的问题,因为我的列带有像“这是一个字符串”这样的字符串,所以分隔符 %s 不起作用。我想知道像只导入一列这样简单的任务会如此重要。
  • @Baloo 这很重要,因为您不能对此类不一致使用固定分隔符。 importdatatextscan 等此类文件读取工具依赖于分隔符。要解决您的问题(假设您没有收到任何错误,而是混合了字符串和数字的输出),请尝试此解决方法。使用importdata approach后,添加这个-out = str2double(out); out = out(~isnan(out))
  • 问题是,importdata 在 --- 在它期望一个数字的一​​行出现之后停止导入。它还将此行中的其他数字更改为 NaN。我将尝试编写一个将 --- 更改为 0 的 bash 脚本。感谢您的帮助!
【解决方案2】:

我认为你可以用更一般的方式解决这个问题。 你说

“不知何故,当我使用 importdata 时,它会在发生 NaN 时在某些行后停止。”

所以不要使用 importdata 而是直接使用 textscan。 (在后台 importdata 基本上是 textscan 的一个包装器,让您的生活更轻松,但如果 importdata 失败,您需要使用 textscan 。)

您可以设置所有这些参数:

CollectOutput, CommentStyle, DateLocale, 
Delimiter, EmptyValue, EndOfLine, 
ExpChars, Headerlines, MultipleDelimsAsOne, 
ReturnOnError, TreatAsEmpty, Whitespace, TextType

如果即使 textscan 失败,您也需要使用 fgetl 并处理这些行,但希望您不需要它。

试试这个代码:

fid = fopen('test.txt');
data=textscan(fid,'%s %f %f','Delimiter',' ','TreatAsEmpty','---','Headerlines',1);
fclose(fid);

Data{2} 将是您的第二个专栏

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2014-11-20
    • 2018-10-31
    相关资源
    最近更新 更多