2015-03-31 4 views
1

У меня есть файл ascii, и я пытаюсь импортировать его в Matlab, чтобы сделать некоторые графики. Есть ли способ импортировать эти данные, даже если они содержат, (запятая), а не. (Точка)?Matlab - импорт данных ascii

00:00:00,000;-2,14; 
00:00:00,001;-1,80; 

Ну, первая колонка, которую я хочу создать, относится ко времени и ее соответствует 00: 00: 00,001; 00: 00: 00002; и т. д. Второй столбец должен быть амплитудой образца, то есть -2,14; -1,80 и т. Д.

+0

Так что именно вы хотите импортировать? Какие количества для каждой строки? Очень неясно, что вы хотите сделать. – rayryeng

+0

Обновите свой вопрос с помощью этой новой информации. – rayryeng

ответ

0

Yup. Сначала используйте importdata, чтобы вы могли читать каждую строку своего текстового файла как ячейку в массиве ячеек. После этого, чтобы разрешить обработку ваших действий в MATLAB, вам необходимо заменить каждый символ , на .. Это позволит вам использовать команды MATLAB для обработки даты и времени. В частности, используйте regular expressions, чтобы помочь вам в этом. Регулярные выражения помогают находить шаблоны в строках. Мы можем использовать эти шаблоны для извлечения необходимых данных. Используйте regexprep для замены всех , символов на ..

Для целей настоящего ответа, например, данные, которые я буду использовать это:

00:00:00,000;-2,14; 
00:00:00,001;-1,80; 
00:00:00,002;-0,80; 
00:00:00,003;2,40; 
00:00:00,004;3,78; 

Таким образом, при условии, что данные хранятся в текстовом файле с именем data.txt, сделайте следующее:

%// Load in each row as a cell array 
A = importdata('data.txt'); 

%// Each row has , replaced with . 
Arep = regexprep(A, ',', '\.'); 

Теперь мы можем разделить все величины, используя ; в качестве разделителя. Мы можем использовать regexp, чтобы помочь нам разделить количество. Далее мы можем разложить данные по:

Arep_decomp = regexp(Arep, '[^;]+', 'match'); 

Первый параметр представляет собой массив ячеек, который содержит каждый из наших строк в текстовом файле (с запятые преобразуется в периоды). Второй параметр - это шаблон, который указывает, что именно вы пытаетесь найти в каждой строке массива ячеек. [^;]+ означает, что вы хотите найти все строки, состоящие из кучки символов , за исключением, пока мы не нажмем на запятую. Как только мы ударим по полуточке, остановимся. 'match' означает, что вы хотите получить фактические строки, которые будут храниться в виде массивов ячеек.

Результата после выполнения Вышеприведенных строк дает:

Arep_decomp{1}{1} = 

00:00:00.000 


Arep_decomp{1}{2} = 

-2.14 


Arep_decomp{2}{1} = 

00:00:00.001 


Arep_decomp{2}{2} = 

-1.80 


Arep_decomp{3}{1} = 

00:00:00.002 


Arep_decomp{3}{2} = 

-0.80 


Arep_decomp{4}{1} = 

00:00:00.003 


Arep_decomp{4}{2} = 

2.40 


Arep_decomp{5}{1} = 

00:00:00.004 


Arep_decomp{5}{2} = 

3.78 

Вы можете видеть, что выходной массив клеток, Arep_decomp является массивом ячеек 5 элементов, где каждая ячейка представляет собой вложенной массив ячеек 2 элемента, где первым элементом является время, а второй элемент - величина. Обратите внимание, что это все строки.

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

HH:MM:SS.FFF 

H для часов, M для минут, S для секунд и F для микросекунд. Используйте datenum, чтобы вы могли конвертировать эти временные представления в номера фактической даты.Вы сделали бы это так, чтобы вы могли построить их на графике, но тогда вы, возможно, захотите отобразить эти времена на сюжете. Это легко сделать, манипулируя некоторыми функциями графика. Тем не менее, используйте cellfun, чтобы мы могли извлечь строки времени в виде отдельного массива, чтобы мы могли использовать это для построения графика позже, а также использовать это, чтобы преобразовать строки времени в числовые числа через datenum и преобразовать числа величин в фактические числа.

Поэтому:

datestr = cellfun(@(x) x{1}, Arep_decomp, 'uni', 0); 
datenums = cellfun(@(x) datenum(x, 'HH:MM:SS.FFF'), datestr); 
mags = cellfun(@(x) str2double(x{2}), Arep_decomp); 

Первая строка кода извлекает из каждой из временных строк как массив одноклеточных - uni=0 флаг важно, чтобы сделать это. Затем мы преобразуем каждую строку времени в число, и преобразуем строки величин в физические числа на str2double.

Теперь все, что вам нужно сделать, это построить данные. Это может быть сделано путем:

plot(datenums, mags); 
set(gca, 'XTick', datenums); 
set(gca, 'XTickLabel', datestr); 

Приведенными выше коды участков данных, где число даты находится на горизонтальной оси, число магнитуды находится на вертикальной оси, но мы, вероятно, хотим переименовать горизонтальную ось, чтобы быть те временные строки, которые вы хотели. Поэтому мы используем для звонков set, чтобы убедиться, что только видимые тики указаны из самих номеров дат, и мы переписываем номера дат так, чтобы они представляли собой строковые представления самих времен.

После того, как мы запустим код выше, мы получаем:

enter image description here

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

step_size = 5; 
plot(datenums, mags); 
set(gca, 'XTick', datenums(1:step_size:end)); 
set(gca, 'XTickLabel', datestr(1:step_size:end)); 

step_size управления, сколько тиков и метки появляются последовательно. Очевидно, что вам необходимо убедиться, что step_size меньше, чем общее количество точек в ваших данных.


Для вашего копирования и вставки удовольствия, это то, что полный код, который я написал, как выглядит:

%// Load in each row as a cell array 
A = importdata('data.txt'); 

%// Each row has , replaced with . 
Arep = regexprep(A, ',', '\.'); 

Arep_decomp = regexp(Arep, '[^;]+', 'match'); 

datestr = cellfun(@(x) x{1}, Arep_decomp, 'uni', 0); 
datenums = cellfun(@(x) datenum(x, 'HH:MM:SS.FFF'), datestr); 
mags = cellfun(@(x) str2double(x{2}), Arep_decomp); 

step_size = 1; 
%step_size = 5; 
plot(datenums, mags); 
set(gca, 'XTick', datenums(1:step_size:end)); 
set(gca, 'XTickLabel', datestr(1:step_size:end)); 
+0

@rearyeng Какой спускной ответ. К сожалению, у меня все еще есть ошибка: Matlabs output: Ошибка при использовании данных (строка 179) DATENUM не удался. Ошибка в @ (х) datenum (х, 'HH: MM: SS.FFF') Ошибка в asd_01_fixed (строка 12) datenums = cellfun (@ (х) datenum (х, «HH: MM: SS.FFF '), datestr); Вызвано: Ошибка при использовании dtstr2dtnummx Не удалось преобразовать строку даты в дату. –

+0

Убедитесь, что ваш текстовый файл соответствует формату, который у меня выше. Я в основном пошел с вашей моделью в ваш вопрос. Если это не формат, тогда код не будет работать. Можете ли вы показать мне пример того, как выглядит ваш текстовый файл? См. Мой пример в начале этого сообщения. Соответствует ли мой текстовый файл и текстовый файл?Помните, я только даю код, который ** работает **, при условии, что вы ** следуете ** тому же формату ввода, который я дал для текстового файла. Если это не так, я не несу ответственности. – rayryeng

+0

Это точно то, что вы сами выяснили (например, HH: MM: SS.FFF). Все идет гладко до тех пор, пока строки datenums = cellfun (@ (x) datenum (x, 'HH: MM: SS.FFF'), СТРОКА-ДАТЫ); кажется, что что-то не так с функцией данных. –

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