使用Matlab保存和格式化文本文件

时间:2015-03-29 21:40:37

标签: matlab csv text formatting

我有一个文本文件,由两行和以下格式组成:

"27 feb 2015","28 feb 2015","1 mar 2015",...
"1","2","3","4",...

如何在两个数组中保存这些值并使用 MATLAB 绘制它们?

修改

第一行包含引号之间的字符串和引号之间的第二个整数。

1 个答案:

答案 0 :(得分:1)

最简单的方法是将两行读作单独的字符串,并使用正则表达式自行解析数据。然后,从那里,您可以将每个日期转换为日期编号,绘制日期,如果需要,您可以在水平轴上绘制实际日期。

使用fgetl打开文件后,最好使用fopen两次。假设您的文件存储在名为data.txt的文件中,并确保将工作目录设置为存储文本文件的位置,请首先执行此操作:

fid = fopen('data.txt', 'r');
first_row = fgetl(fid);
second_row = fgetl(fid);
fclose(fid);

first_rowsecond_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",

当我使用上面的示例时,使用上面的代码,我们得到:

enter image description here


为了您的复制和粘贴乐趣,这就是完整代码的样子:

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);