2010-04-15 57 views
1

我访问使用JDBC和mySQL java connector公共MySQL数据库。 exonCount是int(10),exonStarts和exonEnds是longblob字段。BLOB字段与MATLAB

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列中的数字相匹配。

第1斑点,例如,应该是[21992901; 21998673]。我如何转换它?


更新:

就提交这个问题,我想这可能是一个字符串的十六进制表示之后。 并确认:

>> char(result{1,2}') 
ans = 
21992901,21998673, 

所以现在我需要在所有斑点十六进制数据转换成数字载体。仍想以矢量化的方式来做,因为行数可能很大。

+0

有趣的是,在过去的几天里,在CSS上有一个关于从Matlab访问数据库CLOB的活动线程:http://www.mathworks.com/matlabcentral/newsreader/view_thread/278869 (不回答你的问题但可能会对在这里偶然发现的用户感兴趣) – 2010-04-15 20:06:30

回答

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 
+0

是的,没错!更容易。谢谢。 – yuk 2010-04-15 18:56:15

+0

@gnovice:不,str2num或str2double都不能使用逗号分隔符。 'str2num'返回每个数字作为单独的数字,'str2double'只是忽略逗号作为千位分隔符。 – yuk 2010-04-15 19:45:33

+0

@yuk:我修复了代码中的一个小错误。我忘了调换初始单元格的内容。当他们实际上是18乘1时,我把他们当作1乘18。它现在应该工作。 – gnovice 2010-04-15 20:18:11

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] 

任何更好的解决方案?可能是检索数据的步骤?

1

我建议使用textscan

exons = cellfun(@(x) textscan(char(x'),'%d','Delimiter',','),... 
result(:,2:end),'UniformOutput',false); 

要为这两个数字中的每一个获取单元阵列,可以用%d,%d替换格式字符串并删除Delimiter选项。

+0

有2个错别字:1)''false''应该是'false'。 2)TEXTSCAN'x'的输入需要首先转换为一个带有char(x')'的字符串。 – gnovice 2010-04-15 20:26:49

+0

@Jonas:我刚接受gnovice的回答,然后再看到你的答案。感谢您的选择。 – yuk 2010-04-15 20:30:21

+0

@gnovice:谢谢! – Jonas 2010-04-15 21:01:00