从MySQL数据库检索MATLAB BLOB字段(Retrieve blob field from

2019-10-21 03:47发布

我访问使用JDBC和公共MySQL数据库MySQL的Java连接器 。 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

这是错误的。 向量的第二和第三列中的长度应在第1列中的编号不一致。

的第一斑点,例如,应该是[21992901; 21998673] [21992901; 21998673] 我如何转换呢?


更新:

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

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

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

Answer 1:

这将您的字符数据转换成数字矢量以外的所有数据的第一列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


Answer 2:

我建议使用textscan

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

为了让每一个两个数字的单元阵列,可以替代由格式字符串%d,%d和下降的Delimiter选项。



Answer 3:

这是我做的:

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]

任何更好的解决方案? 也可以在检索数据的步骤?



文章来源: Retrieve blob field from mySQL database with MATLAB