2014-11-04 5 views
2

У меня есть текстовый файл, который содержит данные измерений, заголовок не так важно, так что я использовал это, чтобы удалить первые 25 строкпреобразование ячейки в матрицу, содержащую текст?

% Skip the first 25 lines 
for i=1:25 
fgetl(inputfile); 
end 

Затем я использовал разделитель для того, чтобы получить данные

delimiter = ''; 
    values = textscan(inputfile, '%s', 'delimiter', delimiter); 

Я пытаюсь преобразовать ячейку, состоящую из 1000 символов, как в следующем. Вот что я получил

'2014_11_03_17-19-49 000 430114 516672 960.91 26.2' 
'2014_11_03_17-19-49 001 430112 516656 960.91 26.2' 
'2014_11_03_17-19-49 002 430112 516656 960.91 26.2' 
'2014_11_03_17-19-49 003 430112 516656 960.91 26.2' 

Я пытаюсь преобразовать ячейку, состоящую из 1000 полукокса, как и в предыдущем я относительно о (960.91 и 26,2) значений только.

Я попытался преобразовать его в матрице, но я получил

Этой ошибки не могу поддерживать массивы ячеек, содержащие массивы ячеек или объекты.

Любая идея, как просто получить эти значения в матрицу для их построения.

ответ

1

Подход № 1

Вы можете использовать отличный importdata здесь -

lines_skip = 25; 
values = importdata(inputfile,' ',lines_skip) %// using the delimiter ' ' here 

values будет структура проведения данных inputfile.

Таким образом, fourth column будет values.data(:,4), в то время как values.data(:,5) бы быть fifth один, как показано здесь -

>> values.data(:,4) 
ans = 
    960.9100 
    960.9100 
    960.9100 
    960.9100 
>> values.data(:,5) 
ans = 
    26.2000 
    26.2000 
    26.2000 
    26.2000 

Подход № 2

Если у вас уже есть массив ячеек, как указано в этом вопросе вам больше не нужно беспокоиться о чтении входного файла.Итак, у вас есть что-то вроде этого -

incell = { 
    '2014_11_03_17-19-49 000 430114 516672 960.91 26.2' 
    '2014_11_03_17-19-49 001 430112 516656 960.91 26.2' 
    '2014_11_03_17-19-49 002 430112 516656 960.91 26.2' 
    '2014_11_03_17-19-49 003 430112 516656 960.91 26.2'} 

Далее вы можете использовать cellfun с regexp разделить каждую ячейку на столбцы, используя разделитель ' ' -

cellarr = cellfun(@(x) regexp(x,' ','Split'),incell,'un',0) 
values = vertcat(cellarr{:}) 

который получит Вас -

values = 
    '2014_11_03_17-19-49' '000' '430114' '516672' '960.91' '26.2' 
    '2014_11_03_17-19-49' '001' '430112' '516656' '960.91' '26.2' 
    '2014_11_03_17-19-49' '002' '430112' '516656' '960.91' '26.2' 
    '2014_11_03_17-19-49' '003' '430112' '516656' '960.91' '26.2' 

То есть, пятый и шестой столбцы от values - это данные, которые вы искали после упаковки str2double вокруг них: str2double(values(:,5)) и str2double(values(:,6)).

+0

в случае этих данных в этом формате '' 2014_11_03_17-19-49 '' 000 '' 430114 '' 516672 '' 960,91 ''26 .2' '2014_11_03_17-19-49' '001' '430112' '516656' '960,91 '26 .2 '' 2014_11_03_17-19-49 '' 002 '' 430112 '' 516656 '' 960.91 ''26 .2'' и текст для 2 строк, затем '' 2014_11_03_17-19-49' '000' '430114' '516672' '960,91' '26 .2 '' 2014_11_03_17-19-49 '' 001 '' 430112 '' 516656 '' 960,91 ''26 .2' '2014_11_03_17-19-49' '002' '430112' '516656' '960.91' '26 .2 ' ' – mecaeng

+0

Как я могу обойти эти 2 строки и получить данные? – mecaeng

+0

@mecaeng Давайте предположим, что 'a1' является вашей' строкой 1', поэтому у вас есть - 'a1 = {'2014_11_03_17-19-49' '000' '430114' '516672' '960.91' '26 .2 '' 2014_11_03_17-19- 49 '' 001 '' 430112 '' 516656 '' 960,91 ''26 .2' '2014_11_03_17-19-49' '002' '430112' '516656' '960.91' '26 .2 '} '. Затем выполните 'data_a1 = reshape (a1,6, []) ''. Таким образом, в 'data_a1' у вас будет много столбцов, из которых вам понадобятся пятый и шестой столбцы. Итак, тогда сделайте 'col5 = data_a1 (:, 5)' и, наконец, получите числовые значения с помощью 'col5_num = str2double (col5)'. Посмотрите, работает ли это. – Divakar

1

Используйте другой спецификатор формата с textscan'HeaderLines' option, чтобы пропустить заголовок непосредственно:

>> fid = fopen('testtext.txt','r','HeaderLines',25) 
>> C = textscan(fid,'%s %d %d %d %f %f') 
C = 
    {4x1 cell} [4x1 int32] [4x1 int32] [4x1 int32] [4x1 double] [4x1 double] 
>> fclose(fid); 
>> C{5} 

    960.9100 
    960.9100 
    960.9100 
    960.9100 

Сделайте матрицу concatentation, если вы хотите, например, так:

>> M =[C{5} C{6}] 
M = 

    960.9100 26.2000 
    960.9100 26.2000 
    960.9100 26.2000 
    960.9100 26.2000 

Вы можете даже указать чтобы игнорировать все, кроме выходов:

C = textscan(fid,'%*s %*d %*d %*d %f %*f') 
C = 
    [4x1 double] 

Не забудьте указать fclose(fid) или fclose all, если вы потеряли ручку.

+0

Я использую .log-файл, и я получил эту ошибку. Неверный формат машины. – mecaeng

+0

@mecaeng Какая команда дала это и какая была точная формулировка? – chappjc