2015-01-10 4 views
1
4,7,33 308:0.364759856031284 1156:0.273818346738286 1523:0.17279792082766 9306:0.243665855423149 
7,4,33 1156:0.185729429759684 1681:0.104443202690279 5351:0.365670526234034 6212:0.0964006003127458 

У меня есть текстовый файл в вышеуказанном формате. Первые 3 столбца являются метками и должны быть извлечены в другой файл, сохраняя порядок целым.Чтение сложного формата CSV В Matlab

Как только вы просматриваете файл, каждая строка имеет различное количество меток. Я читал функцию csvread в Matlab, но это общий и не работает в приведенном выше случае.

Далее, мне нужно извлечь

308:0.364759856031284 1156:0.273818346738286 1523:0.17279792082766 9306:0.243665855423149 

таким образом, что в колонке в матрице для строки , я положил в значении 0,364759856031284.

+2

Добро пожаловать в переполнение стека! Я позволил вам немного лучше форматировать ваш вопрос. Вы обнаружите, что обращать внимание на мелочи, такие как грамматика и форматирование, поможет вам получить более качественные ответы! – Shepmaster

+0

Спасибо за это Shepmaster. :) – JohnP

ответ

0

Поскольку ваш формат строки изменения, которые вы должны прочитать файл построчно

fid = fopen(filename, 'rt'); % open file for text reading 
resultMatrix = []; % start with empty matrix 
while 1 
    line = fgetl(fid); 
    if ~ischar(line), break, end 
    % get the value separators, : 
    seps = strfind(line, ':'); 
    % get labels 
    whitespace = iswhite(line(1:seps(1)-1)); % get white space 
    lastWhite = find(whitespace, 'last'); % get last white space pos 
    labelString = deblank(line(1:lastWhite)); % string with all labels separated by , 
    labelString(end+1) = ','; % add final , to match way of extraction 
    ix = strfind(labelString, ','); % get pos of , 
    labels = zeros(numel(ix),1); % create the labels array 
    start = 1; 
    for n1 = 1:numel(labels) 
    labels(n1,1) = str2num(labelString(start:ix(n1)-1)); 
    end 
    % continue and do a similar construction for the COL:VALUE pairs 
    % If you do not know how many rows and columns your final matrix will have 
    % you need to continuously update the size 1 row for each loop and 
    % then add new columns if any of the current rows COLs are outside current matrix 
    cols = zeros(numel(seps,1); 
    values = cols; 
    for n1 = 1:numel(seps) 
    % find out current columns start pos and value end pos using knowledge of 
    % the separator, :, position and that whitespace separates COL:VALUE pairs 
    cols(n1,1) = str2num(line(colStart:seps(n1)-1)); 
    values(n1,1) = str2num(line(seps(n1)+1:valueEnd)); 
    end 
    if isempty(resultMatrix) 
    resultMatrix = zeros(1,max(cols)); % make the matrix large enough to hold the last col 
    else 
    [nR,nC] = size(resultMatrix); % get current size 
    if max(cols) > nC 
     % add columns to resultMatrix so we still can fit column data 
     resultMatrix = [resultMatrix, zeros(nR, max(cols)-nC)]; 
    end 
    % add row 
    resultMatrix = [resultMatrix;zeros(1,max(nC,max(cols)))]; 
    end 
    % loop through cols and values and populate the resultMatrix with wanted data 
end 
fclose(fid); 

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

+0

Спасибо за это. Я решил написать сценарий на C++, который читает каждую строку, а затем разбивает текст на основе разделителей. Я попробую вас сейчас написать и поблагодарить вас за это. – JohnP

Смежные вопросы