Чтение текстовых данных из файла CSV в MATLAB

мои данные в следующем виде:

days of week      date        time(hrs)        visitors
mon            jan 2 2010     900               501 
mon            jan 2 2010    1000               449
mon            jan 2 2010    1100               612

аналогично на каждый день в течение всего года. мне нужно создать матрицу дней недели, как показано ниже:

A=[
    mon
    mon
    mon
]

person Nishant    schedule 20.07.2011    source источник
comment
Кстати, 2 января 2010 года была суббота :)   -  person Amro    schedule 20.07.2011


Ответы (5)


Вот как я буду читать значения, разделенные табуляцией, и анализировать даты:

%# read and parse file
fid = fopen('data.csv','rt');
C = textscan(fid, '%s %s %s %d', 'Delimiter','\t', 'HeaderLines',1, ...
    'MultipleDelimsAsOne',true, 'CollectOutput',false);
fclose(fid);

%# get date and number of visitors
dt = datenum(strcat(C{2}, {' '}, C{3}), 'mmm dd yyyy HHMM');
visitors = C{4};

%# plot
plot(dt,visitors)
datetick('x')
xlabel('time of day'), ylabel('visitors')

введите здесь описание изображения

Что касается столбца дня недели, вы можете получить его как:

>> C{1}                        %# first column from file
ans = 
    'mon'
    'mon'
    'mon'

>> cellstr(datestr(dt,'ddd'))  %# actual day of week from parsed dates
ans = 
    'Sat'
    'Sat'
    'Sat'

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

person Amro    schedule 20.07.2011
comment
Насколько я могу судить, это все еще не работает, если мои строки содержат \n . Это может произойти при экспорте из Excel в csv, а исходные ячейки содержат внутренние разрывы строк. - person Carl Witthoft; 26.01.2017
comment
@CarlWitthoft, это сложно, новые строки в самих значениях полей ... поля в кавычках? может быть, посмотреть спецификатор %q вместо %s? - person Amro; 27.01.2017
comment
Кстати, вы имеете в виду буквальную строку \n или фактическую новую строку (т.е. LF/CRLF)? - person Amro; 27.01.2017
comment
символ новой строки. Вы можете увидеть это, если вы напишете какой-нибудь многострочный текст в Excel, используя метод разрыва строки ‹ALT›-‹ENTER›, затем экспортируете в CSV и откроете в каком-нибудь приличном текстовом редакторе. - person Carl Witthoft; 27.01.2017
comment
@CarlWitthoft хорошо, я только что попробовал, и спецификатор %q работает. Вот мой пример: pastebin.com/Nwd8Vcwx. Хитрость заключается в том, что если в поле есть новая строка, она должна быть заключена в кавычки (что и делает Excel по умолчанию). - person Amro; 27.01.2017
comment
Хорошо знать. Я вернусь и посмотрю, почему мое использование %q не помогло. - person Carl Witthoft; 27.01.2017

Принимая подсказки из предыдущего вопроса,

fid = fopen('filename.txt');
% Skip a line for the header
s = fgetl(fid);
% Read the rest into data
data = textscan(fid, '%s %s %d %d %d %d');
% Close the file
fclose(fid);

Дни недели указаны в первой ячейке data.

person Brendan    schedule 20.07.2011

Вы можете загрузить мою заявку csvimport с File Exchange. Предполагая, что ваши данные разделены табуляцией, вы можете прочитать их, используя:

[days datecol timecol visitors] = csvimport( 'file.txt', 'delimiter', '\t', ...
       'columns', {'days of week', 'date', 'time(hrs)', 'visitors'} );

Первые 2 выходных параметра будут массивами ячеек строк, а последние 2 будут двойными матрицами.

person Praetorian    schedule 20.07.2011

Если вы только начинаете работать с (последней версией) Matlab, проще всего использовать «мастер импорта».

Несколько простых шагов:

  1. Найдите свой файл и щелкните его правой кнопкой мыши.
  2. Выберите вариант для импорта
  3. Выберите вариант для хранения вещей как cell array (векторы или матрицы не будут работать).
  4. Нажмите Импорт

При желании вы можете нажать «Далее», чтобы импортировать и выбрать, что вы хотите сгенерировать код для этой процедуры. Однако это, вероятно, будет немного многословным. Если вам просто нужно сделать это один раз, я бы порекомендовал этот метод.

person Dennis Jaheruddin    schedule 11.10.2013

Вы можете попробовать использовать dlmread. Он может принимать любой разделитель ASCII. Я думаю, что это может удовлетворить ваши требования. См. здесь.

person Sriram    schedule 21.07.2011