Самый быстрый способ импортировать файлы CSV в MATLAB - PullRequest
7 голосов
/ 11 января 2010

Я написал скрипт, который сохраняет свои выходные данные в файл 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);

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

Ответы [ 4 ]

10 голосов
/ 11 января 2010

Вероятно, было бы легче читать данные, если бы вы могли заполнить файл значениями 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
3 голосов
/ 11 января 2010

Вместо разбора строки текстовая строка по одному символу за раз. Вы можете использовать strtok , чтобы разбить строку, например

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;
1 голос
/ 15 августа 2016

У меня была та же проблема с чтением CSV-данных в Matlab, и я был удивлен, насколько мало поддержки этому, но потом я только нашел инструмент для импорта данных. Я в r2015b.

На верхней панели вкладки «Главная» нажмите «Импорт данных» и выберите файл, который вы хотите прочитать. Окно приложения появится так:

Скриншот инструмента Импорт данных

В разделе «Импорт выбора» у вас есть возможность «сгенерировать функцию», которая дает вам довольно много опций настройки, включая способ заполнения пустых ячеек и то, какой должна быть структура выходных данных. Кроме того, он написан MathWorks, поэтому он, вероятно, использует самый быстрый из доступных методов для чтения CSV-файлов. Это было почти мгновенно в моем файле.

0 голосов
/ 11 января 2010

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

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

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

...