我有一个格式化的文本文件。不知何故,当我使用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
答案 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}
将是您的第二栏