将多种类型的文本文件转换为矩阵

时间:2018-01-26 22:16:54

标签: matlab matrix io octave

我正在使用虹膜数据集,它看起来如下......

5.4,3.7,1.5,0.2,Iris-setosa
4.8,3.4,1.6,0.2,Iris-setosa
4.8,3.0,1.4,0.1,Iris-setosa
4.3,3.0,1.1,0.1,Iris-setosa
5.8,4.0,1.2,0.2,Iris-setosa
...

如您所见,数据中有不同的类型。前几个是浮点数,最后一个是字符串。因此,我无法使用dlmread。当我尝试它时,我会遇到错误。

我尝试使用fscanf,但我的解决方案没有给我我想要的东西......

filename = "train.txt"
A = fopen(filename, 'r')
data = fscanf(A, '%f %f %f %f %s')

这将data作为1x1数组。

我想要的是将数据转换为矩阵,我可以按行和列访问值。因此,data(1,1)将是5.4。我对Octave中的I / O并不熟悉,所以感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

以下适用于我,包括Matlab R2017a和Octave 4.2.1。有关详细信息,请参阅textscan documentation

private void givenAddress(Answer answers) {
    when(subscriptionBuilder.observer(any(DataObserver.class))).then(answers);
    when(query.subscribe()).thenReturn(subscriptionBuilder);
    when(queryBuilder.build()).thenReturn(query);
    when(subscriptionBuilder.on(any())).thenReturn(subscriptionBuilder);
    when(subscriptionBuilder.onError(any())).thenReturn(subscriptionBuilder);
    when(queryBuilder.equal(any(Property.class), eq(ADDRESS))).thenReturn(queryBuilder);
    when(addressBox.query()).thenReturn(queryBuilder);

    underTest = new ClassToTest(addressBox);
}

这给出了

fid = fopen('filename.txt');
x = textscan(fid, '%f,%f,%f,%f,%s');
fclose(fid);
x_num = [x{1:4}];
x_str = x{5};

答案 1 :(得分:3)

您可以使用参数CollectOutput设置为true的{​​{3}}轻松实现此目的;

  

确定数据连接的逻辑指示符,指定为   逗号分隔的对由'CollectOutput'和true或者组成   假。如果为true,则导入函数连续连接   将相同基本MATLAB®类的单元输出到单个单元中   阵列。

示例:

filename = 'train.txt';
fid = fopen(filename, 'r');
data = textscan(fid,'%f%f%f%f%s','CollectOutput',true,'Delimiter',',');
fclose(fid);

data变量将以单元格数组的形式返回,其中文件内容将根据基础类型进行分组。第一个单元格将包含数值,而第二个单元格包含字符串值...您可以按如下方式单独检索它们:

numerics = data{1};
texts = data{2};

答案 2 :(得分:0)

Regular experssions对此类问题非常有帮助。它们允许您搜索特定的图案。例如,使用regexp,您可以在数据表中找到模式的所有实例,并使用out = regexp(str, expression, 'match')将其读入数组。根据您设置程序的方式,它可能会以1xn数组的形式读取它。但是,如果您知道每行中的列数,则可以轻松转换为类似vec2mat的数组。