Самый быстрый способ импортировать файлы CSV в MATLAB

Я записал сценарий, который сохраняет его вывод к файлу CSV для дальнейшего использования, но второй сценарий для импорта данных занимает неловкое количество времени для чтения, это въезжает задним ходом.

Данные находятся в следующем формате:

Item1,val1,val2,val3
Item2,val4,val5,val6,val7
Item3,val8,val9

где заголовки находятся на крайнем левом столбце, и значения данных поднимают остаток от строки. Одна главная трудность состоит в том, что массивы значений данных могут быть различными длинами для каждого тестового изделия. Я сохранил бы его как структуру, но я должен смочь отредактировать его вне среды MATLAB, так как иногда я должен удалить строки неправильных данных по компьютеру, которому не установили MATLAB. Таким образом, действительно часть первая моего вопроса: я должен сохранить данные в другом формате?

Вторая часть вопроса: я попробовал importdata, csvread, и dlmread, но я не уверен, который является лучшим, или если существует лучшее решение. Прямо сейчас я использую свой собственный сценарий с помощью цикла и fgetl, который является ужасно медленным для больших файлов. Какие-либо предложения?

function [data,headers]=csvreader(filename); %V1_1
 fid=fopen(filename,'r');
 data={};
 headers={};
 count=1;
 while 1
      textline=fgetl(fid);
      if ~ischar(textline),   break,   end
      nextchar=textline(1);
      idx=1;
      while nextchar~=','
        headers{count}(idx)=textline(1);
        idx=idx+1;
        textline(1)=[];
        nextchar=textline(1);
      end
      textline(1)=[];
      data{count}=str2num(textline);
      count=count+1;
 end
 fclose(fid);

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

7
задан Doresoom 11 January 2010 в 17:56
поделиться

3 ответа

, вероятно, облегчит чтение данных, если вы можете подумать файл с NAN значениями, когда ваш первый скрипт создает его:

Item1,1,2,3,NaN
Item2,4,5,6,7
Item3,8,9,NaN,NaN

или вы могли бы даже печатать Пустые поля:

Item1,1,2,3,
Item2,4,5,6,7
Item3,8,9,,

Конечно, для правильной прокладки вам нужно знать, какое максимальное количество значений по всему элементам - перед рукой. С форматом выше, вы можете использовать один из стандартных функций чтения файлов, например Textscan , например:

>> fid = fopen('uneven_data.txt','rt');
>> C = textscan(fid,'%s %f %f %f %f','Delimiter',',','CollectOutput',1);
>> fclose(fid);
>> C{1}

ans = 

    'Item1'
    'Item2'
    'Item3'

>> C{2}

ans =

     1     2     3   NaN  %# TEXTSCAN sets empty fields to NaN anyway
     4     5     6     7
     8     9   NaN   NaN
10
ответ дан 6 December 2019 в 15:22
поделиться

Я задавал аналогичный вопрос относительно C ++ / VS2008.

VS2008 C ++ Компилятор оптимизирует следующее, если оператор?

Во избежание = vs == Typos в C ++, вы, как правило, пишут

if (NULL == ptr) { ... }
if (false == boo) { ... }
if (20 == num) { ... }

и т. Д.

Это немного менее доступно, пока вы не привыкнете к нему.

-121--2364680-

Вместо того, чтобы разбирать структуру текстовой линии один символ за раз. Вы могли бы использовать СТРТОК , чтобы сломать строку, например

stringParts = {};
tline = fgetl(fid);
if ~ischar(tline), break, end
i=1;
while 1
    [stringParts{i},r]=strtok(tline,',');
    tline=r;
    i=i+1;
    if isempty(r), break; end
end

% store the header
headers{count} = stringParts{1};

% convert the data into numbers
for j=2:length(stringParts)
    data{count}(j-1) = str2double(stringParts{j});
end
count=count+1;
3
ответ дан 6 December 2019 в 15:22
поделиться

Q1) Если вы знаете максимальное количество столбцов, вы можете заполнить пустые записи с помощью NaN Также, если все значения числовые, действительно ли вам нужен столбец "Item#"? Если да, то можно использовать только "#", поэтому все данные числовые.

Q2) Самый быстрый способ чтения числовых данных из файла без mex-файлов - csvread. Я стараюсь избегать использования строк в csv-файлах, но если придется, я использую свою функцию csv2cell:

http://www.mathworks.com/matlabcentral/fileexchange/20135-csv2cell

0
ответ дан 6 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: