Чтение файлов CSV с помощью MATLAB?
Я пытаюсь прочитать в .csv файле с MATLAB. Вот мой код:
csvread('out2.csv')
Вот что выглядит out2.csv:
03/09/2013 23:55:12,129.32,129.33
03/09/2013 23:55:52,129.32,129.33
03/09/2013 23:56:02,129.32,129.33
В окнах я могу без проблем прочитать этот точный файл с функцией xlsread. В настоящее время я на Linux-машине. Когда я впервые использовал xlsread для чтения файла, мне сказали: "Файл не в распознанном формате", поэтому я переключился на использование csvread. Однако, используя csvread, я получаю следующее сообщение об ошибке:
Error using dlmread (line 139)
Mismatch between file and format string.
Trouble reading number from file (row 1u, field 2u) ==> /09/2013
23:55:12,129.32,129.33\n
Error in csvread (line 48)
m=dlmread(filename, ',', r, c)
Я думаю, что "/" в дате вызывает проблему. В окнах 1-й столбец интерпретируется как строка. В linux он интерпретируется как число, поэтому он пытается прочитать число и терпеть неудачу в обратном слэше. По крайней мере, я думаю, что это происходит. Любая помощь будет действительно оценена.
Ответы
Ответ 1
csvread
может читать только удвоения, поэтому он задыхается в поле даты. Используйте textscan
.
fid = fopen('out2.csv');
out = textscan(fid,'%s%f%f','delimiter',',');
fclose(fid);
date = datevec(out{1});
col1 = out{2};
col2 = out{3};
Обновление (8/31/2017)
Поскольку это было записано еще в 2013 году, функция MATLAB textscan
была обновлена для непосредственного чтения дат и времени. Теперь код будет выглядеть так:
fid = fopen('out2.csv');
out = textscan(fid, '%{MM/dd/uu HH:mm:ss}D%f%f', 'delimiter', ',');
fclose(fid)
[date, col1, col2] = deal(out{:});
Альтернативой, упомянутой ниже @Victor Hugo (и в настоящее время моей личной идеей для этого типа ситуации), было бы использовать readtable
, который примет ту же строку форматирования, что и textscan
, но собирает результаты непосредственно в объект таблицы:
dataTable = readtable('out2.csv', 'Format', '%{MM/dd/uu HH:mm:ss}D%f%f')
dataTable.Properties.VariableNames = {'date', 'col1', 'col2'};
dataTable =
3×3 table
date col1 col2
___________________ ______ ______
03/09/2013 23:55:12 129.32 129.33
03/09/2013 23:55:52 129.32 129.33
03/09/2013 23:56:02 129.32 129.33
Ответ 2
К сожалению, документация для csvread
четко заявляет:
M = csvread(filename)
считывает форматированный файл с разделителями-запятыми, filename
. Файл может содержать только числовые значения.
Так как /
не является ни запятой, ни числовым значением, она вызывает ошибку.
Ответ 3
Вы можете использовать readtable
, так как он примет любой ввод.
https://www.mathworks.com/help/matlab/ref/readtable.html