Matlab dataimport

问题描述 投票:0回答:2

我的dataimport的matlab代码给了我不同的结果,看起来像是类似的文本文件作为输入。 Input1给了一个普通的单元格,其中包含文本文件中的所有行作为单元格中的条目,我可以使用{i}引用它。 Input2给我一个标量数据结构,其中我的文本文件中的所有数字条目都转换为input.data结构。我希望所有文件都转换为常规单元格条目,我不明白为什么有些文件会将它们转换为标量数据结构。

代码:input = importdata(strcat(direct,'\',filename));

Input1示例:Correctly working dataimport, with text file on the right文件链接:https://drive.google.com/open?id=1aHK4xivqEqJEmaA8Dv8Y0uW5giG-Bbip

Input2示例:Incorrectly working data import, with text file on the right文件链接:https://drive.google.com/open?id=1nzUj_wR1bNXFcGaSLGva6uVsxrk-R5vA

matlab octave
2个回答
0
投票

分析

这看起来确实很奇怪!

编辑:这种奇怪的行为的原因已被@Andy破译(见他的解决方案)。

当您使用importdata()函数的所有输出时,您可以看到读取数据时会发生什么:

[dat1,del1,headerrows1]=importdata('Input1.txt')
[dat2,del2,headerrows2]=importdata('Input2.txt')

对于您的第一个文件,它识别69个标题行,没有分隔符:

del1 = []
headerrows1 =  69

在第二个文件中,只识别两个标题行和一个逗号,分隔符

del2 = ','
headerrows2 =  2

我在文件中找不到明显的原因导致对数据的这种不同解释。

建议

您的数据格式相当复杂。它不是像excel一样生成的简单表格。它有多行,每行具有不同数量的字段和不同的数据类型。 importdata()不是为此类数据而设计的。我建议为这种文件编写一个特定的导入函数。看看textread()的第一个猜测。您可以使用它来读取文件的行作为文本,然后使用sscanf()解释它或使用strsplit()将行内容拆分为字段。


2
投票

UTSL!

我猜您正在使用GNU Octave,尽管您正在编写“Matlab”作为您问题的主题。

在第178行的importdata.m中,代码尝试自动检测数据的分隔符:

delim = regexpi (row, '[-+\d.e*ij ]+([^-+\de.ij])[-+\de*.ij ]','tokens', 'once');

如果你对W40A0060;运行这个,你会得到A作为分隔符,因为它之前和之后基本上都有一个数字。

如果你对W39E0016;运行这个,你得到{}作为分隔符(空),因为E可能是科学记数法中数字的一部分,因此被排除在外。

解:

你真的应该为importdata调用添加正确的分隔符,而不要相信它被神奇地检测到。

如果你只想要一个单元格中的行,请使用

strsplit (fileread ("W39E0016_Input2.txt"), "\n")
© www.soinside.com 2019 - 2024. All rights reserved.