仅在Matlab中使用importdata导入某些列

时间:2014-05-14 12:22:39

标签: matlab nan text-processing

我有一个格式化的文本文件。不知何故,当我使用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

2 个答案:

答案 0 :(得分:0)

Importdata方法

对于单元格数组输出,您可以使用此 -

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)

Textscan方法

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

答案 1 :(得分:0)

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

  

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

所以不要使用importdata,而是直接使用textscan。 (引擎盖下的importdata基本上是文本扫描的包装器,可以让你的生活更轻松,但是如果importdata失败,你需要使用文本扫描。)

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

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

如果偶数文本扫描失败,您需要使用fgetl并处理这些行,但我们希望您不需要它。

试试这段代码:

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

Data{2}将是您的第二栏