使用 Matlab 保存和格式化文本文件
Saving and formatting text file with Matlab
我有一个文本文件,由两行组成,格式如下:
"27 feb 2015","28 feb 2015","1 mar 2015",...
"1","2","3","4",...
如何将这些值保存在两个数组中并使用MATLAB绘制它们?
编辑
第一行包含引号之间的字符串,第二行包含引号之间的整数。
最简单的方法是将这两行作为单独的字符串读入,然后使用正则表达式自行解析数据。然后从那里,您可以将每个日期转换为日期数字,绘制日期,如果需要,您可以在水平轴上绘制实际日期。
最好的办法是使用 fgetl
twice once you open up your file using fopen
。假设您的文件存储在名为 data.txt
的文件中,并确保将工作目录设置为存储文本文件的位置,请先执行以下操作:
fid = fopen('data.txt', 'r');
first_row = fgetl(fid);
second_row = fgetl(fid);
fclose(fid);
first_row
和 second_row
将包含包含文本文件第一行和第二行的字符数组。我们打开文件,读入前两行,然后使用 fclose
. Next, we can very easily split up the dates using regular expressions. Regular expressions try to find patterns in strings. Specifically, we have a well defined pattern where you want to get out strings that are in between quotation characters. Specifically, you want a bunch of characters that are digits, letters or spaces. Use regexp
关闭文件以帮助您完成此操作。您将通过以下代码提取日期:
dates = regexp(first_row, '\"([\w+ ]+)\",', 'tokens');
第一个元素是您要解析的字符串,第二个元素是您要查找的模式。具体来说,模式是 \"([\w+ ]+)\"
。这个看起来很糟糕的语句意味着您正在寻找我们以 "
开头的模式,有一大堆字符后跟空格,然后我们以另一个 "
结束。我将 ()
放在引号之间,因为我不想在输出中出现引号字符。我使用 'tokens
' 标志,因为这意味着我想获得 ()
中的实际字符。当我 运行 上面的行并显示输出时,我们得到:
>> 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);
我有一个文本文件,由两行组成,格式如下:
"27 feb 2015","28 feb 2015","1 mar 2015",...
"1","2","3","4",...
如何将这些值保存在两个数组中并使用MATLAB绘制它们?
编辑
第一行包含引号之间的字符串,第二行包含引号之间的整数。
最简单的方法是将这两行作为单独的字符串读入,然后使用正则表达式自行解析数据。然后从那里,您可以将每个日期转换为日期数字,绘制日期,如果需要,您可以在水平轴上绘制实际日期。
最好的办法是使用 fgetl
twice once you open up your file using fopen
。假设您的文件存储在名为 data.txt
的文件中,并确保将工作目录设置为存储文本文件的位置,请先执行以下操作:
fid = fopen('data.txt', 'r');
first_row = fgetl(fid);
second_row = fgetl(fid);
fclose(fid);
first_row
和 second_row
将包含包含文本文件第一行和第二行的字符数组。我们打开文件,读入前两行,然后使用 fclose
. Next, we can very easily split up the dates using regular expressions. Regular expressions try to find patterns in strings. Specifically, we have a well defined pattern where you want to get out strings that are in between quotation characters. Specifically, you want a bunch of characters that are digits, letters or spaces. Use regexp
关闭文件以帮助您完成此操作。您将通过以下代码提取日期:
dates = regexp(first_row, '\"([\w+ ]+)\",', 'tokens');
第一个元素是您要解析的字符串,第二个元素是您要查找的模式。具体来说,模式是 \"([\w+ ]+)\"
。这个看起来很糟糕的语句意味着您正在寻找我们以 "
开头的模式,有一大堆字符后跟空格,然后我们以另一个 "
结束。我将 ()
放在引号之间,因为我不想在输出中出现引号字符。我使用 'tokens
' 标志,因为这意味着我想获得 ()
中的实际字符。当我 运行 上面的行并显示输出时,我们得到:
>> 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);