Чтение данных из .net-файлов в MATLAB

#.net #matlab #file-io #import

#.net #matlab #file-io #импорт

Вопрос:

У меня есть большой объем данных, которые хранятся в нескольких файлах .net, и я хотел обработать их с помощью MATLAB (моя текущая версия — R2013a). Несмотря на поиск на веб-сайте MathWorks, я не смог найти ни одной команды для импорта данных из файлов .net, поскольку ncread команда работает только для файлов .nc. Изображение структуры файла (файлов) после открытия с помощью Notepad можно увидеть здесь.

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

Одним из вариантов было бы для меня вручную открыть каждый файл с помощью Notepad и заменить x00x1fx00 на n , затем открыть файл с помощью Microsoft Excel, разделенный пробелами, и сохранить его как файл .csv, который я, в свою очередь, могу импортировать в MATLAB с csvread помощью команды. Однако, поскольку у меня почти 600 файлов .net, это не представляется практичным решением просто из-за масштаба требуемых усилий. Я был бы очень признателен, если бы кто-нибудь мог мне помочь в этом отношении и предложить эффективный метод чтения этих файлов в MATLAB. Большое вам спасибо.

Комментарии:

1. Не могли бы вы опубликовать где-нибудь некоторые фактические данные, чтобы мы могли попробовать решения? Спасибо!

2. @darthbith Мне действительно очень жаль, но я не имею права публиковать данные или любую их репрезентативную выборку в Интернете. Следовательно, я мог показать вам только скриншот.

Ответ №1:

Вот решение:

 function mat=filetrim(filename,'NUL US NUL') % 
tic
fid=fopen(filename);
if (isunix) % Linux or Mac
    [~, result] = system( ['wc -l ', filename] );
    nl=strcat(regexp(result,'[d]','match'));
    numlines = str2double(nl);

elseif (ispc) % Windows
    numlines = str2double( perl('countlines.pl', 'your_file') );

else
    error('...');

end
tline=fgetl(fid);
r=regexp(strtrim(tline(7:end-6)),pat,'split');% here I assumed that the line ends with
                                              % US NUL. If the line does not end with
                                              % US NUL, please change the "end-6" to
                                              % "end".
d=cell2mat(cellfun(@str2num,r,'UniformOutput',false));
mat=zeros(numlines,size(d,2));
for i=1:size(mat,1)
    r=regexp(strtrim(tline(7:end-6)),pat,'split');
    mat(i,:)=cell2mat(cellfun(@str2num,r,'UniformOutput',false));
end
fclose all;
toc
return
 

Цикл для определения количества строк в файле был адаптирован из одного из решений, представленных в «Stackoverflow». За эту часть спасибо @Rody Oldenhuis.

Комментарии:

1.Спасибо за вашу помощь, но, похоже, в вашем коде есть проблема. Следующее сообщение об ошибке, которое я получаю при попытке его выполнить: Subscripted assignment dimension mismatch. Error in filetrim (line 17) mat(i,:)=cell2mat(cellfun(@str2num,r,'UniformOutput',false)); Не могли бы вы, пожалуйста, проверить это? Спасибо!

2. пожалуйста, пришлите мне файл, над которым вы работаете. Я попробовал использовать образец файла, и это сработало. Мой почтовый идентификатор naveen.bhatraju@igib.in

3. @UserXeTex, я только что видел ваш предыдущий комментарий и узнал, что вы не можете отправить файл данных. Сделайте одну вещь, просто скопируйте первую и последнюю строки входного файла в другой текстовый файл и отправьте мне.

Ответ №2:

Функции, которые следует учитывать: