Matlab - 导入ascii数据

时间:2015-03-31 21:15:28

标签: matlab

我有一个ascii文件,我试图将它导入matlab以制作一些图。有没有办法导入这些数据,即使它们包含,(逗号)而不是。 (点)?

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

我要创建的第一列是指时间,它对应于00:00:00,001; 00:00:00002;等等 第二列应该是样本的幅度,即-2,14; -1,80等。

1 个答案:

答案 0 :(得分:0)

烨。首先使用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));
相关问题