我正在使用JDBC和mySQL java connector访问公共mySQL数据库。 exonCount是int(10),exonStarts和exonEnds是 longblob 字段。
javaaddpath('mysql-connector-java-5.1.12-bin.jar')
host = 'genome-mysql.cse.ucsc.edu';
user = 'genome';
password = '';
dbName = 'hg18';
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
dbConn = database(dbName, user , password, jdbcDriver, jdbcString);
gene.Symb = 'CDKN2B';
% Check to make sure that we successfully connected
if isconnection(dbConn)
qry = sprintf('SELECT exonCount, exonStarts, exonEnds FROM refFlat WHERE geneName=''%s''',gene.Symb);
result = get(fetch(exec(dbConn, qry)), 'Data');
fprintf('Connection failed: %s\n', dbConn.Message);
end
结果如下:
result =
[2] [18x1 int8] [18x1 int8]
[2] [18x1 int8] [18x1 int8]
result{1,2}'
ans =
50 49 57 57 50 57 48 49 44 50 49 57 57 56 54 55 51 44
这是错误的。第2列和第3列中的向量长度应与第1列中的数字匹配。
例如,第一个blob应为[21992901; 21998673]
。我怎么能转换它?
更新
提交此问题后,我认为它可能是字符串的十六进制表示。 并且确认:
>> char(result{1,2}')
ans =
21992901,21998673,
所以现在我需要将所有blob十六进制数据转换为数字向量。仍在考虑以矢量化的方式进行,因为行数可能很大。
答案 0 :(得分:3)
除了result
中的第一列数据外,这会将您的角色数据转换为数字向量,将结果放回相应的单元格中:
result(:,2:end) = cellfun(@(x) str2num(char(x'))',... %# Apply fcn to each cell
result(:,2:end),... %# Input cells
'UniformOutput',false); %# Output as a cell array
答案 1 :(得分:1)
我建议使用textscan
exons = cellfun(@(x) textscan(char(x'),'%d','Delimiter',','),...
result(:,2:end),'UniformOutput',false);
要获取这两个数字中的每一个的单元格数组,您可以将格式字符串替换为%d,%d
并删除Delimiter
选项。
答案 2 :(得分:0)
以下是我的工作:
function res = blob2num(x)
res = str2double(regexp(char(x'),'[^,]+','match')');
然后
exons = cellfun(@blob2num,result(:,2:3)','UniformOutput',0)
exons =
[2x1 double] [2x1 double]
[2x1 double] [2x1 double]
有更好的解决方案吗?可能在检索数据的步骤?