Получите поле большого двоичного объекта из базы данных mySQL с помощью MATLAB

Я получаю доступ к общедоступной базе данных mySQL с помощью JDBC и коннектора Java для 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-м столбце.

1-й блоб, например, должен быть [21992901; 21998673]. Как я могу преобразовать его?


Обновление:

Сразу после отправки этого вопроса я подумал, что это может быть шестнадцатеричное представление строки. И подтвердилось:

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

Итак, теперь мне нужно преобразовать все шестнадцатеричные данные больших двоичных объектов в числовые векторы. Все еще думаю сделать это векторизованным способом, так как количество строк может быть большим.


person yuk    schedule 15.04.2010    source источник
comment
что интересно, за последние несколько дней на CSSM появилась активная ветка о доступе к CLOB БД из Matlab: mathworks.com/matlabcentral/newsreader/view_thread/278869 (не отвечает на ваш вопрос, но может быть интересен пользователям, которые наткнутся здесь)   -  person Yair Altman    schedule 16.04.2010


Ответы (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
person gnovice    schedule 15.04.2010
comment
@gnovice: Нет, ни str2num, ни str2double не работают с разделителями-запятыми. str2num возвращает каждую цифру как отдельное число, а str2double просто игнорирует запятые как разделитель тысяч. - person yuk; 15.04.2010
comment
@yuk: я исправил небольшую ошибку в коде. Я забыл перенести исходное содержимое ячейки. Я рассматривал их как 1 на 18, хотя на самом деле они 18 на 1. Теперь это должно работать. - person gnovice; 16.04.2010
comment
мило, я не знал, что str2num может это сделать! - person Jonas; 16.04.2010

Я предлагаю использовать textscan

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

Чтобы получить массив ячеек для каждого из двух чисел, вы можете заменить строку формата на %d,%d и удалить параметр Delimiter.

person Jonas    schedule 15.04.2010
comment
Есть 2 опечатки: 1) 'false' должно быть просто false. 2) Входные данные для TEXTSCAN x необходимо сначала преобразовать в строку с char(x'). - person gnovice; 16.04.2010
comment
@Jonas: я только что принял ответ gnovice, прежде чем увидел ваш. Спасибо за альтернативу. - person yuk; 16.04.2010

Вот что я делаю:

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]

Любое лучшее решение? Может быть на этапе получения данных?

person yuk    schedule 15.04.2010