2014-10-01 3 views
2

я пытаюсь импортировать данные из текстового файла в MATLAB, который имеет следующую структуру:импортировать данные из текстового файла в MATLAB с несколькими разделителями

** Porosity 
** 
*POR *ALL 
0.1500 0.0900 2*0.1300 0.1400 4*0.1500 0.2200 2*0.1500 0.0500 
0.0900 0.1400 5*0.1500 0.2300 0.2600 0.0800 0.1500 0.1500 0.2400 0.1700 
[...] 

Заголовок должен быть проигнорированы, очевидно. Пробел - это разделитель, а * указывает, что одно и то же значение происходит несколько раз, как указано целым числом до *.

К сожалению, количество записей на линию варьируется. В идеале я хочу хранить все значения в одном массиве, как это:

por = [0.1500 0.0900 0.1300 0.1300 0.1400 0.1500 0.1500 0.1500 0.1500 0.1500 0.2200 0.1500 0.1500 ...] 

Может ли это быть решена с помощью textscan команды каким-то образом? Файл довольно большой с несколькими сотнями тысяч значений, поэтому мне нужно быстрое решение;) Помощь очень ценится!

+0

У вас есть код, который вы «Мы нашли или попробовали до сих пор, с чем мы сможем помочь? Это поможет получить быстрое, конкретное решение. –

+0

Да, вы можете использовать textscan. Я бы прочитал его в использовании пространства в качестве разделителя, а затем использовал regexp, чтобы найти все повторяющиеся числа. Я мог бы поднять некоторый псевдокод, но было бы лучше, если бы вы отправили какой-то код из своих собственных попыток помочь нам. – Trogdor

+0

У меня было медленное решение для другого файла, но в этом случае произошли только множители «2 *» и «4 *», а значения составляли красиво определенную матрицу с последовательным количеством записей в строке. Сначала я загрузил файл в Excel, сохранил его как .xlsx и загрузил его с помощью xlsread. Затем мой код будет запускаться для циклов if и if для выполнения этой работы. Это было довольно трудоемкое и неэффективное решение проблемы. Кроме того, теперь я не могу предсказать множители, поэтому я не могу адаптировать свой код к новому файлу. Я не знаком с командой textscan, но просматривая другие сообщения, которые, как я понял, может быть решением. –

ответ

0

прямой путь (я не использовал Matlab в течение длительного периода времени, так что это может быть не лучшим решением)

fid = fopen('temp.txt'); 
data = textscan(fid, '%s', 'delimiter', ' '); 
fclose(fid); 

out = convert_cells(data); 

И функция

function out = convert_cells(cells) 
    out = []; 
    for i = 1 : size(cells{1}) 
    tmp = strsplit(cells{1}{i}, '*'); 
    num1 = str2double(tmp(1)); 
    if size(tmp, 2) == 2 && ~isnan(num1) 
     num2 = str2double(tmp(2)); 
     if ~isnan(num2) 
      out = [out repmat(num2, 1, num1)]; 
     end; 
    elseif size(tmp, 2) == 1 && ~isnan(num1) 
     out(end + 1) = num1; 
    end; 
    end; 
end 
+0

Это работает как шарм! Спасибо. Два вопроса: почему вы проверяете, является ли num1 числом или нет? Чтобы исключить заголовок? Во-вторых, чтобы игнорировать заголовок, я предполагаю, что могу начать цикл for на более высоком i (в моем случае 6), правильно? –

+0

@ DanielDüsentrieb Да, он проверяет, есть ли у нас номер. Вы можете пропустить, если хотите. – Cheery

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