我有一个大型csv文件(应该是大约100万行),其中包含具有以下结构的选项数据(内容已更改):
secid, date, days, delta, impl_volatility, impl_strike, impl_premium, dispersion, cp_flag, ticker, index_flag, industry_group
100000, 02/05/1986, 60, -80, 0.270556, 74.2511, 5.2415, 0.021514, C, ASC, 0, 481
100000, 03/05/1986, 30, -40, 0.251556, 74.2571, 6.2415, 0.025524, P, ASC, 0, 481
我已使用以下方法成功导入了测试文件:
ftest = fopen('test.csv');
C = textscan(ftest,'%f %s %f %f %f %f %f %f %s %s %f %f','Headerlines',1,'Delimiter',',');
fclose(ftest);
但是,C是一个单元格数组,这使得在matlab中处理文件内容变得更加困难。将它作为“常规”数组更容易(原谅我不知道正确的命名法,我刚开始使用matlab)。
如果我输出C,我得到:
Columns 1 through 6
[2x1 double] {2x1 cell} [2x1 double] [2x1 double] [2x1 double] [2x1 double]
Columns 7 through 12
[2x1 double] [2x1 double] {2x1 cell} {2x1 cell} [2x1 double] [2x1 double]
因此在C单元格数组中,有数组和单元格数组 - 数字数组和字符串数组。如果我尝试检查元素(1,2),我必须使用C {1}(2),但如果我想检查元素(2,2),我必须使用C {2} {2}。理想情况下,我想同时访问C(1,2)和C(2,2)。 问题是,我该怎么做?
我搜索了解决方案并找到了cells2mat,但只有当所有内容都是数字时(我认为)它才有效。我找到了这个解决方案:Convert cell array of cell arrays to matrix of matrices但是horzcat检索到一个错误,我认为可能由于同样的问题而发生错误。
提前感谢您的时间。
答案 0 :(得分:5)
由于你有一个包含数字和字符数据的数组,你想要的是不可能的(相信我,它也是不切实际的)。
引用数字数组中的单个数字与引用整个字符串不同。根本就没有逃避,也不应该:你对待鲜花与对待人们的方式不同(我当然希望如此)。
在MATLAB中,字符串是普通数组,不同之处在于数组的每个条目都不代表数字,而是字符。引用单个字符与引用数组中的数字相同:
>> a = 'my string'
>> a(4)
ans =
s
>> a+0 % cast to double to show the "true character" of strings
ans =
109 121 32 115 116 114 105 110 103
但是,textscan
假设(理所当然地)您不想那个,而是想要从文件中提取整个字符串 。并且应该以不同的方式引用整个字符串,以表示您指的是整个字符串而不是单个字符。
我认为如果将结果从textscan
分成普通的数字数组和字符串的单元格数组,我认为你会发现它更直观一些,如下所示:
% load the data
ftest = fopen('test.csv');
C = textscan(ftest,...
'%f %s %f %f %f %f %f %f %s %s %f %f',...
'collectoutput', true,...
'Delimiter',',\n');
fclose(ftest);
% split into numeric and char arrays
numeric = [C{[1 3 5]}]
alpha = [C{[2 4]}]
在numeric
中引用数据然后遵循与任何普通数组相同的规则,并引用alpha
中的字符串,然后遵循正常的单元格引用规则(如在alpha{2,1}
中获取{ {1}})
编辑根据您的评论,您不想这样进行转换:
'03/05/1986'
答案 1 :(得分:0)
我遇到了同样的问题......我更喜欢使用2-D单元阵列以便于访问并使用内置的matlab排序功能。
这是另一个可能适合您的解决方案(这是TMW在导入工具中的自动生成代码中执行此操作的方式)。它将数值数组转换为单元格数组,以便您可以将它们连接成2-D矩阵。
C([1,3,4,5,6,7,8,11,12]) = cellfun(@(x) num2cell(x), C([1,3,4,5,6,7,8,11,12]),'UniformOutput', false);
C = [C{1:end}];