我正在使用虹膜数据集,它看起来如下......
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并不熟悉,所以感谢您的帮助。
答案 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的数组。