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