2016-12-31 2 views
1

У меня есть некоторые файлы с около 3000 записей, включая текст и числовые данные, аналогичные этим:импорт данных из файлов неизвестного формата в MATLAB

1 0 23 'x' 'x' 'x' 0 0 0 1 1 10.3 54 123.45678 'x' 'x' 'x' ... 

я хочу импортировать каждый файл данных в отдельном 1x3000 вектор в MatLab но когда я использую функцию importdata, он создает структуру 1x1 с двумя полями (данные и текстовые данные).

file_path = '/home/my/file/path'; 
list_of_files = dir(file_path); 
for i = 3:end_ 
new_data = importdata(fullfile(file_path,list_of_files(i).name)); 
end 

Также я пытался использовать «TextScan» функцию, но она требует спецификации формата, но формат файлов неизвестен (длина каждого файла постоянна, но не ясно, где мы имеем «х», или число)

У кого-нибудь есть предложения, что делать?

ответ

1

Вы не можете иметь массив, содержащий как числовые значения, так и строки.

Если вы хотите иметь как числовые значения, так и строки, вы должны использовать cellarray.

Поскольку, как вы писали, вам не нравится иметь структуру с двумя полями, используя textscan, кажется многообещающим способом, даже если это будет немного сложно.

Вы можете преодолеть проблему format спецификации, указав:

  • format в string
  • delimiter в ' (в вас, например текст включен в двух ')

Ваш входной файл будет храниться в ящике в виде набора строк.

Теперь вы можете извлечь как числовые значения, так и строки, сканируя элементы сотового массива.

Чтобы определить числовые значения, вы можете попытаться преобразовать строку в числовой массив с помощью функции str2num:

  • если строка содержит только nueric значения, вы можете хранить кумулятивно значения в массиве
  • если conversin не удается, это означает, что это была строка, то вы можете хранить его кумулятивно в строке

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

Также для обоих условий вы можете оценить длину частичных массивов чисел или строки и сохранить их в другом массиве.

Это позволяет вам понять, где определенное число или строка находилась во входном файле.

В этом случае вы можете найти возможную реализацию описанного выше подхода.

% Open the input file 
fp=fopen('mix_n_s.dat','r'); 
% Read the input file as a string in a cell array using "'" as a 
% delimitator 
% c=textscan(fp,'%s','delimiter',''''); 
c=textscan(fp,'%s','delimiter',''''); 
% Close the input file 
fclose(fp); 
% Extract the cell array 
a=c{1}; 
% Initialize the output variables 
% Array with the numeric values 
numeric_array=[]; 
% String with the string in the input file 
the_strings=[]; 
% Array with the number of numeric values and strings 
the_cnt=[]; 
% Define the flag for enabling the isertion of NaN in the output numeric 
% array in case a string is found 
insert_nan=1; 
% Scan the cellarray to extract the numbers and the strings 
for i=1:length(a) 
    x=a{i} 
    % If the i-th element is empty (this occurs when there are at least two 
    % consecutive string in the input file, do nothing 
    if(~isempty(x)) 
     % If the i-th element is not empty try to convert it into a numeric array 
     m=str2num(x); 
     % If the output is not empty you have read one or more than one 
     % numeric values 
     if(~isempty(m)); 
     % Then store them into an array 
     numeric_array=[numeric_array m]; 
     % The lengh of the array gives you the number of numeric values; 
     % store it the array 
     the_cnt=[the_cnt length(m)]; 
     else 
     % If the conversin failed, you have read a string; store it in a 
     % string 
     the_strings=[the_strings ' ' x]; 
     % Store the length of the string in the array; if you store it as 
     % a negative value, you can recognise it later on 
     the_cnt=[the_cnt -length(x)]; 
     % if the flag is on, then insert NaN in the numeric array 
     if(insert_nan) 
      numeric_array=[numeric_array NaN]; 
     end 
     end 
    end 
end 

numeric_array 
the_strings 
the_cnt 

Основываясь на примере ввода предоставленных Вами (я немного изменил строку):

1 0 23 'x' 'x' 'x' 0 0 0 1 1 10.3 54 123.45678 'x' 'x' 'x' 

выхода является следующим (флагом для inssert NaN включен):

numeric_array = 
    Columns 1 through 7 
    1.0000   0 23.0000  NaN  NaN  NaN   0 
    Columns 8 through 14 
     0   0 1.0000 1.0000 10.3000 54.0000 123.4568 
    Columns 15 through 17 
     NaN  NaN  NaN 


the_strings = 
x abcd efghilm x x x 

the_cnt = 
    3 -1 -4 -7  8 -1 -1 -1 

Это можно интерпретировать следующим образом:

  • глядя на numeric_array массива: в файле ввода
    • три числовых значений, то три строки, затем восемь числовых значений и три строки
  • глядя на the_cnt массив, вы можете понять длину (отбросить знак -) каждой строки.

Надеюсь, это поможет.

Qapla '

+0

Полный и всесторонний ответ. Благодарю. –

+0

Добро пожаловать! С новым годом!!! –

+0

С Новым годом;) –

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