2014-11-25 2 views
0

все,Запись в файл CSV

У меня есть массив ячеек с 5 клеток, как показано ниже:

<18250x1 int32> <18250x1 int32> <18250x1 int32> <18250x1 double> <18250x1 double> 

В каждой клетке есть число 18250 строк и 1 столбца.

Теперь я хочу записать эти данные в файл csv с 18250 строками, 5 столбцами.

Я пробовал Cell2mat, который позволяет массиву иметь одни и те же типы данных. Мне нужно поддерживать типы данных int или double в выходе. Кто-нибудь знает, как решить эту проблему?

Спасибо, Джеймс.

ответ

2

Это будет немного сложно, поскольку каждая ячейка имеет другой тип данных. Единственный способ, с помощью которого я могу уважать тип данных, - это вручную создать собственный CSV-файл, открыв файл для записи, а затем вручную записывая записи в файл CSV по одной строке за раз. Помните, что CSV-файлы разделены запятыми, поэтому число разделяется запятой, и каждая строка разделяется каретой.

Вы в основном проходите через каждую строку для конкретной ячейки, а затем записываете свои данные как есть, соблюдая тип данных и помещая запятую между каждым значением и вручную помещая возврат каретки для каждой строки ваших данных. Если предположить, что данные хранятся в массиве ячеек называется M, вы можете сделать что-то вроде этого:

fid = fopen('test.csv', 'w'); 
for idx = 1 : 18250 
    val1 = M{1}(idx); 
    val2 = M{2}(idx); 
    val3 = M{3}(idx); 
    val4 = M{4}(idx); 
    val5 = M{5}(idx); 
    fprintf(fid, '%d,%d,%d,%f,%f\n', val1, val2, val3, val4, val5); 
end 
fclose(fid); 

Приведенный выше код открывает файл для записи под названием test.csv с помощью fopen. Это возвращает ссылку на файл, который мы хотим записать. Затем мы перебираем каждый соответствующий элемент в каждом массиве ячеек, затем вручную записываем его как строку в файле. Каждый номер разделяется запятой и составляет одну строку в вашем CSV-файле, учитывая тип данных для каждого номера. Как только мы закончим, мы вручную разместим возврат каретки и переходим к следующему ряду, пока не закончим. Затем мы закрываем файл, чтобы указать, что мы прекратили запись в файл, и мы можем применить изменения.

Попробуйте это и посмотрите, работает ли это!

+0

Спасибо, Rayryeng, он работает втирают после небольшого изменения кода. fid = fopen ('test.csv ',' wt '); для idx = 1: 18250 val1 = M {1} (idx); val2 = M {2} (idx); val3 = M {3} (idx); val4 = M {4} (idx); val5 = M {5} (idx); fprintf (fid, '% d,% d,% d,% f,% f \ n', val1, val2, val3, val4, val5); конец fclose (fid); – James

+0

@James Ты, наверное, поймал меня, когда я исправил небольшую ошибку. Я забыл об одном в заявлении 'fprintf'. Если это поможет, пожалуйста, подумайте о принятии моего ответа! – rayryeng

+1

Для тех, кого это любопытно, так [документация для 'fprintf'] (http://www.mathworks.com/help/matlab/import_export/write-to-delimited-data-files.html#br2ypq2-1) инструктирует пользователю, как печатать массивы ячеек в файл. Вы также можете собрать все вложенные ячейки в массив одного уровня ('newarray = [M {1} (:), M {2} (:), ..., M {n} (:)' для этого примера), но если вы все равно зацикливаетесь, я не думаю, что вы что-то получаете. – excaza

2

Просто создать массив ячеек сравнима с вашими:

>> A = { int32(randi(100,100,1)) , int32(randi(100,100,1)) , int32(randi(100,100,1)) , rand(100,1)*100 , rand(100,1)*100 } 
A = 
    [100x1 int32] [100x1 int32] [100x1 int32] [100x1 double] [100x1 double] 

Вы можете конвертировать int32 столбец удвоить перед записью их в файл с dlmwrite. Для первых 3 столбцов Matlab распознает, что они являются целыми числами, и соответственно отрегулирует выход записи. В течение последних 2-х колонок, Matlab запишет двойной точности в точности указать:

B = [double(cell2mat(A(:,1:3))) , cell2mat(A(:,4:5)) ] ; 
dlmwrite('testwrite.csv', B , 'precision',10) 

Этот выход в моем случае:

26,100,1,87.70487234,93.37256595 
40,23,85,35.31418129,81.09500322 
8,66,93,44.94435566,48.45482718 
69,61,78,96.35302868,75.67492101 
... and so on 
+0

Ницца. Я всегда забываю о 'dlmwrite'. – rayryeng

+0

Отлично. Это также работает. Спасибо, Хоки. – James

+1

@rayryeng, yep. Я просто боялся, что 'dlmwrite' не позволит указывать другой формат для каждого столбца (как позволяет' fprintf'), поэтому мне пришлось попробовать его. Но, наконец, Matlab попытается оптимизировать (компактный) формат сам по себе ... так что он работает в этом случае. Не очень гибкий, хотя большинство других проблем с написанием смешанного типа данных потребует 'fprintf', как вы показали. – Hoki

Смежные вопросы