代码之家  ›  专栏  ›  技术社区  ›  yuk

用matlab从mysql数据库中检索blob字段

  •  1
  • yuk  · 技术社区  · 16 年前

    我正在使用jdbc访问公共mysql数据库 mySQL java connector . 外显子是int(10),外显子和外显子是 长斑 领域。

    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,
    

    所以现在我需要把所有blobs十六进制数据转换成数值向量。仍在考虑以矢量化的方式执行,因为行数可能很大。

    3 回复  |  直到 13 年前
        1
  •  3
  •   gnovice    16 年前

    这将把所有字符数据转换为数值向量,除了 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
    
        2
  •  1
  •   Jonas    16 年前

    我建议使用文本扫描

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

    要为这两个数字中的每一个获取单元格数组,可以将格式字符串替换为 %d,%d 放弃 Delimiter 选择权。

        3
  •  0
  •   yuk    16 年前

    以下是我的工作:

    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]
    

    有更好的解决办法吗?可能正在检索数据?