Получить поле BLOB-объекта из базы данных MySQL с помощью MATLAB - PullRequest
1 голос
/ 15 апреля 2010

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

Это неправильно. Длина векторов во 2-м и 3-м столбцах должна соответствовать числам в 1-м столбце.

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


Обновление:

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

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

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

Ответы [ 3 ]

3 голосов
/ 15 апреля 2010

Это преобразует данные вашего персонажа в числовые векторы для всех, кроме первого столбца данных в 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
1 голос
/ 16 апреля 2010

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

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

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

0 голосов
/ 15 апреля 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]

Есть ли лучшее решение? Может быть, на этапе извлечения данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...