代码之家  ›  专栏  ›  技术社区  ›  dewalla

如果文件主要是文本,如何使用matlab中的“textscan”读取一系列数字?

  •  1
  • dewalla  · 技术社区  · 15 年前

    我有一个文本文件,有一个3个数字的字符串,我需要读到matlab。

    例如:

    #######################
    #
    #
    #    Text Text Text
    #
    #
    #######################
    
    Blah blah blah = ####
    Blah blah blah = ####
    Blah blah blah = ####
    Blah blah blah = ####
    Blah blah blah = ####
    Blah blah blah = ####
    
    
    I_NEED_THIS_STRING =  1234.5 6789.0 1234.5 !Comment blah blah blah
    

    我需要把这3个数字读入一个数组。

    请帮忙。

    谢谢

    2 回复  |  直到 13 年前
        1
  •  5
  •   Will Robertson    14 年前

    如果大多数文件与您的应用程序无关,我建议使用您最喜欢的脚本语言或命令行工具进行预处理,以找到相关的行,并在此基础上使用textscan()。

    例如,从shell提示:

    grep ^I_NEED_THIS_STRING infile > outfile
    

    在MATLAB中:

    fid = fopen('outfile');
    C = textscan(fid, 'I_NEED_THIS_STRING = %f %f %f')
    fclose(fid)
    

    textscan documentation 了解更多详细信息。

        2
  •  3
  •   gnovice    15 年前

    另一种选择是使用 IMPORTDATA 要将整个文件读取到字符串的单元格数组中(每个单元格一行),请使用 STRMATCH 查找包含字符串的单元格 'I_NEED_THIS_STRING' 然后使用 SSCANF 要从该单元格中提取3个值:

    >> data = importdata('mostly_useless_text.txt','\n');  %# Load the data
    >> index = strmatch('I_NEED_THIS_STRING',data);  %# Find the index of the cell
                                                     %#   containing the string
    >> values = sscanf(data{index},'I_NEED_THIS_STRING = %f %f %f')  %# Read values
    
    values =
    
      1.0e+003 *
    
        1.2345
        6.7890
        1.2345
    

    如果文件可能有 很多 对于你感兴趣的行之前或之后的无用文本,你可以通过将它们全部加载到一个变量中,在matlab中消耗大量的内存。您可以通过使用循环和函数一次加载和分析一行来避免这种情况。 FGETS :

    fid = fopen('mostly_useless_text.txt','r');  %# Open the file
    newLine = fgets(fid);                        %# Get the first line
    while newLine ~= -1                          %# While EOF hasn't been reached
      if strmatch('I_NEED_THIS_STRING',newLine)  %# Test for a match
        values = sscanf(newLine,'I_NEED_THIS_STRING = %f %f %f');  %# Read values
        break                                    %# Exit the loop
      end
      newLine = fgets(fid);                      %# Get the next line
    end
    fclose(fid);                                 %# Close the file