Matlab Split-String

时间:2015-02-12 18:54:56

标签: string matlab split

您好, 我有一点问题。 我有一个超过200mb的txt文件。 看起来像是:

  

%Hello World

     

%秒句

     

%第三;

     

%实例

     

2014年2月12日

     

; - 400; -200; 200

     

; 123; 233; 434

     

%Hello World

     

%秒句

     

%第三

     

%实例

     

2014年2月12日

     

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

2 个答案:

答案 0 :(得分:0)

蛮力方法是打开你的文件,然后一次读取每一行。对于每一行,您检查第一个字符是否为分号,如果是,则将该字符串从该行的第二个字符中的;分隔符拆分,直到结束。您将收到一个字符串的单元格数组,因此您必须将其转换为数字数组。因为您可能每行都包含不同数量的数字,所以让我们将每个数组存储到一个单元格数组中,此单元格数组中的每个元素都将包含每行数字。因此,做这样的事情。我们假设您的文本文件存储在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来实现此目的。如果我们读取-1,这意味着我们已到达文件的末尾,因此退出循环。否则,我们检查第一个字符是否为;。如果是,那么我们查看第二个字符直到该行的结尾,并根据;字符和strsplit分割字符串。结果将是一个字符串数组,其中每个元素都是数字的字符串表示形式。您需要将此单元格数组转换回数字数组,因此您需要执行的操作是将str2num应用于此单元格中的每个元素。您可以使用循环遍历每个单元格,也可以方便地使用[cellfun](http://www.mathworks.com/help/matlab/ref/cellfun.html来允许您遍历此单元格中的每个元素并将字符串表示转换为数值。cellfun的结果输出将为您提供由该行的;字符分隔的每个值的数值数组表示。然后,我们将此数组放入存储在nums中的单个单元格中。

整个代码的最终结果将为您提供基于您在nums中存储的内容的数字数组。

警告

如果我们遇到以;开头的行,我假设您的文字文件的数字由;个字符分隔。如果不是这样,那么我的代码将无效。我假设情况并非如此!

答案 1 :(得分:0)

这可能是假设统一结构化数据(每行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