2015-09-13 8 views
2

Я создаю случайные данные в 5 столбцах и сохраняю их как CSV-файл. Это прекрасно работает, мой CSV на самом деле содержит 1001 строку; мои данные с заголовком (я проверил это, открыв его в редакторе электронных таблиц). Однако, когда я снова прочитал его в MATLAB, используя , я получаю сообщение об ошибке, если не укажу разделитель, и когда я указываю разделитель data содержит только 957 строк, поэтому заголовок и первые 42 строки отсутствуют. Что здесь происходит?csvread падает строки в MATLAB

код:

A = rand(1e3,5); 
out = fopen('output.csv','w'); 
fprintf(out,['ColumnA', ',', 'ColumnB', ',', 'ColumnC', ',', 'ColumnD', ',', 'ColumnE','\n']); 
fclose(out); 
dlmwrite('output.csv', A, 'delimiter',',','-append'); 
data = csvread('output.csv',','); 

Ошибка:

Error using dlmread (line 139) Mismatch between file and format string. Trouble reading number from file (row 1u, field 1u) ==> ColumnA,ColumnB,ColumnC,ColumnD,ColumnE\n

Error in csvread (line 48) m=dlmread(filename, ',', r, c);

я упускаю что-то глупое в письменной форме или чтение файла?

Я запускаю MATLAB R1012a на 64-битной машине Windows 7. (Хотя я надеюсь перейти на R2015b в следующем месяце)

ответ

3

Причина в том, что вы используете недействительный синтаксис csvread. От help csvread:

M = csvread('FILENAME') reads a comma separated value formatted file FILENAME. The result is returned in M. The file can only contain numeric values.

M = csvread('FILENAME',R,C) reads data from the comma separated value formatted file starting at row R and column C. R and C are zero- based so that R=0 and C=0 specifies the first value in the file.

M = csvread('FILENAME',R,C,RNG) reads only the range specified by RNG = [R1 C1 R2 C2] where (R1,C1) is the upper-left corner of the data to be read and (R2,C2) is the lower-right corner. RNG can also be specified using spreadsheet notation as in RNG = 'A1..B7'.

Вы не может сказать csvread, что разделителем для использования. Когда вы вызываете его таким образом, он интерпретирует ' как число 44 (в ascii) и использует это как стартовую строку.

Вызов вместо этого: data = csvread('output.csv',1);

+0

Я получаю сообщение об ошибке, когда I * dont * использует разделитель, но вызываю 'data = csvread ('output.csv');' когда I * do * использует разделитель, он отлично работает, но оставляет строки. Наверное, мне просто нужно было использовать 1, ура. Я чувствую себя как скраб, что я не правильно прочитал документы. ~ – Adriaan

+0

@Adriaan, действительно, вы это делаете, поэтому я предложил 1 :) Я думаю, если вы не укажете стартовую строку, то Matlab не будет попытайтесь определить, есть ли строка строки в файле и начинается с интерпретации этого как числовых данных, следовательно, ошибки. И не будьте слишком тяжелы на себе, встроенные функции анализа данных Matlab, как известно, являются изворотливыми. –

2

Во-первых, на MATLAB 2014b, у меня есть другая ошибка

Error using dlmread (line 138) HeaderLines must be integer-valued. Error in csvread (line 47) m=dlmread(filename, ',', r, c);

В MATLAB, я обычно импортировать данные через импорт данных интерфейса. На вкладке Home нажмите Import Data, там у вас есть много вариантов, чтобы убедиться, что импорт данных верен. Наилучшая часть интерфейса - это функция генерации кода. У вас есть возможность генерировать код, который MATLAB фактически использует для импорта данных. Например, это то, что я получил:

filename = 'output.csv'; 
delimiter = ','; 
startRow = 2; 
formatSpec = '%f%f%f%f%f%[^\n\r]'; 
fileID = fopen(filename,'r'); 
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'HeaderLines', startRow-1, 'ReturnOnError', false); 
fclose(fileID); 
ColumnA = dataArray{:, 1}; 
ColumnB = dataArray{:, 2}; 
ColumnC = dataArray{:, 3}; 
ColumnD = dataArray{:, 4}; 
ColumnE = dataArray{:, 5}; 
clearvars filename delimiter startRow formatSpec fileID dataArray ans; 

Он работает правильно. Как вы можете видеть, вы можете легко изменить код, чтобы адаптировать функцию импорта к вашим потребностям.

+1

Импорт данных через графический интерфейс является довольно уродливым и неэффективным, особенно при использовании fileraders в сочетании с 'dir()', чтобы считывать сразу несколько файлов. – Adriaan

+0

Причина, по которой я использую GUI, - получить код для импорта довольно странно структурированного набора данных. Как только я получу код, я больше не использую графический интерфейс. Цель GUI - помочь вам, когда ситуация становится сложной, и импорт не может быть легко обработан существующей функцией. В связи с этим я считаю этот GUI очень полезным. – user3667217