#.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:
Функции, которые следует учитывать:
- fgetl
- dlmread
- textscan
- NC toolbox для чтения нескольких стандартных форматов файлов. http://code.google.com/p/nctoolbox /