2011-12-19 2 views
4

У меня есть массив ячеек, который нужно распечатать в формате .txt в соответствии с определенным форматом. Я попробовал некоторые из онлайн-помощи (в том числе центральный dlmcell MATLAB, но даже это не дает мне нужный ответ Разделитель \ траспечатать массив ячеек как .txt в Matlab

cellarray = { ... 
     'AAPL' '2/20/2011' 100.5 
     'MSFT' '2/15/2011' 43.4551 
      } ; 

Выход должен быть в текстовом файле в следующем формате..: (с помощью вкладки разделитель)

"AAPL" "2/20/2011" 100.5 
"MSFT" "2/15/2011" 43.4551 

ячейки будет иметь минимум 8000 строк и максимум 15000. строки не будут иметь пустые столбцы. Является Векторизованным решением возможно? Shall ценит вашу помощь.

ответ

7

Ниже будет работать на вашем примере:

C = cellarray.'; 
fid = fopen('file.dlm', 'wt'); 
fprintf(fid, '"%s"\t"%s"\t%g\n', C{:}); 
fclose(fid); 

MATLAB повторно строку форматирования, пока она не исчерпывает входов. В принципе, можно было бы построить строку форматирования первого:

fstr = ''; 
for ic = 1:size(cellarray,2) 
    switch class(cellarray{1,ic}) 
     case 'char' 
      fstr = [fstr '"%s"']; 
     otherwise 
      % Assume numeric 
      fstr = [fstr '%g']; 
    end 
    if ic < size(cellarray,2), fstr = [fstr '\t']; else fstr = [fstr '\n']; end 
end 

Тогда

C = cellarray.'; 
fid = fopen('file.dlm', 'wt'); 
fprintf(fid, fstr, C{:}); 
fclose(fid); 
+0

спасибо. Но оба решения дают один и тот же код ошибки -> Ошибка 1 ??? Ссылка на содержимое ячеек от объекта несетевого массива. Ошибка в ==> fprintf (fid, '"% s" \ t "% s" \ t% g \ n', C {:}); Ошибка 2 – Maddy

+0

switch class (cellarray {1, ic}) – Maddy

+1

Это означает, что 'cellarray' не является массивом ячеек. – Nzbuu

3

Я часто использовать комбинацию DLMWRITE и XLS НАПИСАТЬ. DLMWRITE используется для создания текстового файла, поэтому XLSWRITE не будет генерировать файл в формате Excel, но оставит его в виде текста.

filename = 'file.txt'; 
dlmwrite(filename, 1) 
xlswrite(filename, cellarray) 

Обратите внимание, что в ОС, где COM не доступен (например, Linux) XLSWRITE писать текст, так что вам не нужен вызов DLMWRITE.


UPDATE

Этот метод больше не работает с последними версиями MATLAB (так, вероятно, R2012b). xlswrite всегда записывает файл в формате Excel.

Однако, поскольку R2013b MATLAB введен TABLES, а функция WRITETABLE работает отлично, если массив ячеек можно преобразовать в таблицу (проверьте функцию CELL2TABLE).

+0

благодаря Yuk. Он отлично работает, но требуется 18 секунд для печати 3 колос для 15 тыс. Строк. Я надеюсь на более быструю альтернативу. Я даже не уверен, возможно ли это сейчас. – Maddy

+0

'xlswrite' довольно медленный, потому что ему нужно сначала запустить и подключиться к Excel. Но это, наверное, больше, чем на пару секунд. – Nzbuu

+0

Это отличный способ написать вывод, не пройдя через грязные для loosps ... спасибо – RnD