我有一个文本文件,由两行和以下格式组成:
"27 feb 2015","28 feb 2015","1 mar 2015",...
"1","2","3","4",...
如何在两个数组中保存这些值并使用 MATLAB 绘制它们?
修改
第一行包含引号之间的字符串和引号之间的第二个整数。
答案 0 :(得分:1)
最简单的方法是将两行读作单独的字符串,并使用正则表达式自行解析数据。然后,从那里,您可以将每个日期转换为日期编号,绘制日期,如果需要,您可以在水平轴上绘制实际日期。
使用fgetl
打开文件后,最好使用fopen
两次。假设您的文件存储在名为data.txt
的文件中,并确保将工作目录设置为存储文本文件的位置,请首先执行此操作:
fid = fopen('data.txt', 'r');
first_row = fgetl(fid);
second_row = fgetl(fid);
fclose(fid);
first_row
和second_row
将包含包含文本文件的第一行和第二行的字符数组。我们打开文件,读取前两行,然后用fclose
关闭文件。接下来,我们可以使用regular expressions轻松分割日期。正则表达式尝试在字符串中查找模式。具体来说,我们有一个定义良好的模式,您希望获取引号字符之间的字符串。具体来说,您需要一堆数字,字母或空格的字符。使用regexp
可帮助您完成此操作。您可以通过以下代码提取日期:
dates = regexp(first_row, '\"([\w+ ]+)\",', 'tokens');
第一个元素是您要解析的字符串,第二个元素是您要查找的模式。具体而言,模式为\"([\w+ ]+)\"
。这个看起来很糟糕的语句意味着你正在寻找我们从"
开始的模式,有一大堆字符后跟空格,然后我们以另一个"
结束。我将()
放在引号之间,因为我不想要输出中的引号字符。我使用'tokens
' flag因为这意味着我想获得()
中的实际字符。当我运行上面的行并显示输出时,我们得到:
>> celldisp(dates)
dates{1}{1} =
27 feb 2015
dates{2}{1} =
28 feb 2015
dates{3}{1} =
1 mar 2015
我们对第二行做同样的事情,但我们只查找数字:
numbers = regexp(second_row, '\"(\d+)\",', 'tokens');
在这里,我们寻找的模式是\"(\d+)\"
,这意味着我们想在引文之间寻找一系列数字。显示此输出给出:
>> celldisp(numbers);
numbers{1}{1} =
1
numbers{2}{1} =
2
numbers{3}{1} =
3
numbers{4}{1} =
4
因为numbers
是一个单元格数组,所以使用cellfun
将元素转换为数字数组:
numbers = cellfun(@(x) str2double(x{1}), numbers);
它遍历单元格数组中的每个元素,这是一个嵌套单元格,我们将数字转换为实际数值。请记住,这些仍然是人物。
现在,您所要做的就是将日期转换为数字,进行绘图,如果需要,您可以将日期数转换为实际日期。所以:
dates = cellfun(@(x) x{1}, dates, 'uni', 0);
datenums = datenum(dates, 'dd mmm yyyy');
dates
最初是一个嵌套的字符串单元格数组,因此我们需要解压缩字符串,以便将每个字符串放入一个单元格数组中。 datenum
将日期字符串转换为实际日期编号。您提供了格式字符串,在您的情况下,它是dd mm yyyy
。
现在,您所要做的就是绘制内容:
plot(datenums, numbers);
set(gca, 'XTick', datenums);
set(gca, 'XTickLabel', dates);
第一行描绘了我们的东西。第二行和第三行重命名x
- 轴,因此我们使用日期而不是数值。
我制作了一个包含以下内容的示例文本文件:
"27 feb 2015","28 feb 2015","1 mar 2015","2 mar 2015",
"1","2","3","4",
当我使用上面的示例时,使用上面的代码,我们得到:
为了您的复制和粘贴乐趣,这就是完整代码的样子:
fid = fopen('data.txt', 'r');
first_row = fgetl(fid);
second_row = fgetl(fid);
fclose(fid);
dates = regexp(first_row, '\"([\w+ ]+)\",', 'tokens');
dates = cellfun(@(x) x{1}, dates, 'uni', 0);
numbers = regexp(second_row, '\"(\d+)\",', 'tokens');
numbers = cellfun(@(x) str2double(x{1}), numbers);
datenums = datenum(dates, 'dd mmm yyyy');
plot(datenums, numbers);
set(gca, 'XTick', datenums);
set(gca, 'XTickLabel', dates);