Matlab 拆分字符串
Matlab Split-String
您好,
我有一个小问题。
我有一个超过 200mb 的 txt 文件。
看起来像:
%Hello World
%second sentences
%third;
%example
12.02.2014
;-400;-200;200
;123;233;434
%Hello World
%second sentences
%third
%example
12.02.2014
;-410;200;20300
;63;23;43
;23;44;78213
..
... ...
我只需要分号后的值,例如:
值 1{1,1}=[-400];值{1,2}=[-200];和值{1,3}=[200]
值 2{1,1}=[123];值{1,2}=[233];和值{1,3}=[434]
等等。
有没有人有想法,我如何拆分元胞数组或 vektor 中的值?
因此,变量必须是:
Var1=[-400 -200 200;
434 233 434;
Var2=[
-410 200 20300;
63 23 43;
23 44 28213]
我会在每个日期之后用另一个值分开。例如,当我有 55 个日期时,我将有 55 个值。
shareeditundeleteflag
一种蛮力方法是打开您的文件,然后一次读取每一行。对于每一行,您检查第一个字符是否为分号,如果是,则通过 ;
分隔符将字符串与 第二个 字符分开排队到最后。您将收到一个字符串元胞数组,因此您必须将其转换为一个数字数组。因为您可能会让每一行包含不同数量的数字,所以让我们将每个数组存储到一个元胞数组中,该元胞数组中的每个元素都将包含每行的数字。因此,做这样的事情。假设您的文本文件存储在 text.txt
:
fid = fopen('text.txt');
if fid == -1
error('Cannot find file');
end
nums = {};
while true
st = fgetl(fid);
if st == -1
break;
end
if st(1) == ';'
st_split = strsplit(st(2:end), ';');
arr = cellfun(@str2num, st_split);
nums = [nums arr];
end
end
我们慢慢看上面的代码。我们首先使用 fopen
打开文件进行读取。我们检查从 fopen
返回的 ID 是否为 -1,如果是,我们将无法找到或打开该文件,因此报错。接下来,我们声明一个名为 nums
的空单元格数组,它将存储您在解析文本文件时获得的数字。
现在,直到我们到达文件末尾,从文件顶部开始获取一行文本,然后我们继续到最后。我们使用 fgetl
for this. If we read a -1, this means we have reached the end of the file, so get out of the loop. Else, we check to see if the first character is ;
. If it is, then we take a look at the second character until the end of this line, and split the string based on the ;
character with strsplit
. The result of this will be a cell array of strings where each element is the string representation of your number. You need to convert this cell array back into a numeric array, and so what you would need to do is apply str2num
to each element in this cell. You can either use a loop to go through each cell, or you can conveniently use [cellfun
](http://www.mathworks.com/help/matlab/ref/cellfun.html 允许您遍历此单元格中的每个元素并将字符串表示形式转换为数值。 cellfun
的结果输出将为您提供每个值的数字数组表示,该值由该行的 ;
字符分隔。然后我们将这个数组放入存储在 nums
中的单个单元格中。
这整个代码的最终结果将为您提供基于存储在 nums
.
中的内容的数值数组
警告
如果我们遇到以 ;
开头的行,我假设您的文本文件 只有 包含由 ;
个字符分隔的数字。如果不是这种情况,那么我的代码将不起作用。我假设情况并非如此!
这可能是一种假设结构统一的数据(每行 3 个有效数字)的方法 -
%// Read in entire text data into a cell array
data = importdata('sample.txt','');
%// Remove empty lines
data = data(~cellfun('isempty',data))
%// Find boundaries based on delimiter "%example"
exmp_delim_matches = arrayfun(@(n) strcmp(data{n},'%example'),1:numel(data))
bound_idx = [find(exmp_delim_matches) numel(exmp_delim_matches)]
%// Find lines that start with delimiter ";"
matches_idx = find(arrayfun(@(n) strcmp(data{n}(1),';'),1:numel(data)))
%// Select lines that start with character ";" and split lines based on it
%// Split selected lines based on the delimiter ";"
split_data = regexp(data(matches_idx),';','split')
%// Collect all cells data into a 1D cell array
all_data = [split_data{:}]
%// Select only non-empty cells and convert them to a numeric array.
%// Finally reshape into a format with 3 numbers per row as final output
out = reshape(str2double(all_data(~cellfun('isempty',all_data))),3,[]).' %//'
%// Separate out lines based on the earlier set bounds
out_sep = arrayfun(@(n) out(matches_idx>bound_idx(n) & ...
matches_idx<bound_idx(n+1),:),1:numel(bound_idx)-1,'Uni',0)
%// Display results for verification
celldisp(out_sep)
代码运行-
out_sep{1} =
-400 -200 200
123 233 434
out_sep{2} =
-410 200 20300
63 23 43
23 44 78213
您好, 我有一个小问题。 我有一个超过 200mb 的 txt 文件。 看起来像:
%Hello World
%second sentences
%third;
%example
12.02.2014
;-400;-200;200
;123;233;434
%Hello World
%second sentences
%third
%example
12.02.2014
;-410;200;20300
;63;23;43
;23;44;78213
..
... ...
我只需要分号后的值,例如:
值 1{1,1}=[-400];值{1,2}=[-200];和值{1,3}=[200]
值 2{1,1}=[123];值{1,2}=[233];和值{1,3}=[434]
等等。
有没有人有想法,我如何拆分元胞数组或 vektor 中的值?
因此,变量必须是:
Var1=[-400 -200 200;
434 233 434;
Var2=[ -410 200 20300;
63 23 43; 23 44 28213]
我会在每个日期之后用另一个值分开。例如,当我有 55 个日期时,我将有 55 个值。 shareeditundeleteflag
一种蛮力方法是打开您的文件,然后一次读取每一行。对于每一行,您检查第一个字符是否为分号,如果是,则通过 ;
分隔符将字符串与 第二个 字符分开排队到最后。您将收到一个字符串元胞数组,因此您必须将其转换为一个数字数组。因为您可能会让每一行包含不同数量的数字,所以让我们将每个数组存储到一个元胞数组中,该元胞数组中的每个元素都将包含每行的数字。因此,做这样的事情。假设您的文本文件存储在 text.txt
:
fid = fopen('text.txt');
if fid == -1
error('Cannot find file');
end
nums = {};
while true
st = fgetl(fid);
if st == -1
break;
end
if st(1) == ';'
st_split = strsplit(st(2:end), ';');
arr = cellfun(@str2num, st_split);
nums = [nums arr];
end
end
我们慢慢看上面的代码。我们首先使用 fopen
打开文件进行读取。我们检查从 fopen
返回的 ID 是否为 -1,如果是,我们将无法找到或打开该文件,因此报错。接下来,我们声明一个名为 nums
的空单元格数组,它将存储您在解析文本文件时获得的数字。
现在,直到我们到达文件末尾,从文件顶部开始获取一行文本,然后我们继续到最后。我们使用 fgetl
for this. If we read a -1, this means we have reached the end of the file, so get out of the loop. Else, we check to see if the first character is ;
. If it is, then we take a look at the second character until the end of this line, and split the string based on the ;
character with strsplit
. The result of this will be a cell array of strings where each element is the string representation of your number. You need to convert this cell array back into a numeric array, and so what you would need to do is apply str2num
to each element in this cell. You can either use a loop to go through each cell, or you can conveniently use [cellfun
](http://www.mathworks.com/help/matlab/ref/cellfun.html 允许您遍历此单元格中的每个元素并将字符串表示形式转换为数值。 cellfun
的结果输出将为您提供每个值的数字数组表示,该值由该行的 ;
字符分隔。然后我们将这个数组放入存储在 nums
中的单个单元格中。
这整个代码的最终结果将为您提供基于存储在 nums
.
警告
如果我们遇到以 ;
开头的行,我假设您的文本文件 只有 包含由 ;
个字符分隔的数字。如果不是这种情况,那么我的代码将不起作用。我假设情况并非如此!
这可能是一种假设结构统一的数据(每行 3 个有效数字)的方法 -
%// Read in entire text data into a cell array
data = importdata('sample.txt','');
%// Remove empty lines
data = data(~cellfun('isempty',data))
%// Find boundaries based on delimiter "%example"
exmp_delim_matches = arrayfun(@(n) strcmp(data{n},'%example'),1:numel(data))
bound_idx = [find(exmp_delim_matches) numel(exmp_delim_matches)]
%// Find lines that start with delimiter ";"
matches_idx = find(arrayfun(@(n) strcmp(data{n}(1),';'),1:numel(data)))
%// Select lines that start with character ";" and split lines based on it
%// Split selected lines based on the delimiter ";"
split_data = regexp(data(matches_idx),';','split')
%// Collect all cells data into a 1D cell array
all_data = [split_data{:}]
%// Select only non-empty cells and convert them to a numeric array.
%// Finally reshape into a format with 3 numbers per row as final output
out = reshape(str2double(all_data(~cellfun('isempty',all_data))),3,[]).' %//'
%// Separate out lines based on the earlier set bounds
out_sep = arrayfun(@(n) out(matches_idx>bound_idx(n) & ...
matches_idx<bound_idx(n+1),:),1:numel(bound_idx)-1,'Uni',0)
%// Display results for verification
celldisp(out_sep)
代码运行-
out_sep{1} =
-400 -200 200
123 233 434
out_sep{2} =
-410 200 20300
63 23 43
23 44 78213