2010-04-15 8 views
1

J'accède à la base de données MySQL publique en utilisant JDBC et mySQL java connector. exonCount est int (10), exonStarts et exonEnds sont longblob champs.Récupérer le champ blob de la base de données mySQL avec 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 

Voici le résultat:

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 

Ceci est faux. La longueur des vecteurs dans les 2ème et 3ème colonnes doit correspondre aux nombres de la 1ère colonne.

La première goutte, par exemple, doit être [21992901; 21998673]. Comment je peux le convertir?


Mise à jour:

Juste après avoir soumis cette question, je pensais que ce serait peut-être la représentation hexagonale d'une chaîne. Et il a été confirmé:

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

Alors maintenant, je besoin de convertir toutes les données hexagonaux blobs dans des vecteurs numériques. Je pense toujours à le faire de manière vectorisée, car le nombre de lignes peut être important.

+0

assez intéressant, dans les derniers jours, il y a un fil actif sur CSSM sur l'accès DB CLOBs de Matlab: http://www.mathworks.com/matlabcentral/newsreader/view_thread/278869 (ne répond pas à votre question mais pourrait être intéressant pour les utilisateurs qui tombent sur ici) –

Répondre

3

Cela vous permet de convertir vos données de caractère à des vecteurs numériques pour tous, sauf la première colonne de données dans result, en plaçant les résultats dans les cellules appropriées:

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

Ouais, c'est vrai! Encore plus facile. Merci. – yuk

+0

@gnovice: Non, ni "str2num" ni "str2double" ne fonctionnent avec des délimiteurs de virgule. 'str2num' renvoie chaque chiffre comme un nombre séparé, et' str2double' ignore simplement les virgules comme séparateur de milliers. – yuk

+0

@yuk: J'ai corrigé un petit bug dans le code. J'ai oublié de transposer le contenu initial de la cellule. Je les traitais comme 1 par 18, alors qu'ils sont 18 par 1. Cela devrait fonctionner maintenant. – gnovice

0

Voici ce que je fais:

function res = blob2num(x) 
res = str2double(regexp(char(x'),'[^,]+','match')'); 

puis

exons = cellfun(@blob2num,result(:,2:3)','UniformOutput',0) 
exons = 
    [2x1 double] [2x1 double] 
    [2x1 double] [2x1 double] 

Toute meilleure solution? Peut-être sur l'étape de récupération des données?

1

Je suggère d'utiliser textscan

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

Pour obtenir un tableau de cellules pour chacun des deux nombres, vous pouvez remplacer la chaîne de format par %d,%d et supprimer l'option Delimiter.

+0

Il y a 2 fautes de frappe: 1) ''false'' devrait juste être' false'. 2) L'entrée de TEXTSCAN 'x' doit d'abord être convertie en une chaîne avec' char (x ') '. – gnovice

+0

@Jonas: Je viens d'accepter la réponse de gnovice avant de voir la vôtre. Merci pour l'alternative. – yuk

+0

@gnovice: merci! – Jonas