在matlab中从未知格式的文件导入数据

时间:2016-12-31 10:35:24

标签: matlab

我有一些包含大约3000个条目的文件,包括与此类似的文本和数字数据:

file_path = '/home/my/file/path';
list_of_files = dir(file_path);
for i = 3:end_
new_data = importdata(fullfile(file_path,list_of_files(i).name));
end

我想在MatLab中的单独的1x3000向量中导入每个文件数据,但是当我使用'importdata'函数时,它会创建一个带有两个字段(data和textdata)的1x1结构。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

此外我尝试使用'textscan'功能,但它需要格式规范,但文件格式未知(每个文件的长度是不变的,但不清楚我们在哪里'x'或数字)

有人有建议怎么办?

1 个答案:

答案 0 :(得分:1)

您不能拥有包含数值和字符串的数组。

如果您想同时拥有数值和字符串,则必须使用cellarray

因为,正如你所写的,你不喜欢有两个字段的结构,使用textscan似乎是一种很有前途的方法,即使它有点复杂。

您可以通过指定:

来克服format规范的问题
  • formatstring
  • delimiter'(在您的示例中,文字包含在两个'内)

您的输入文件将作为字符串的sset存储在cellarray中。

现在,您可以通过扫描cellarray的元素来提取数值和字符串。

要识别数值,您可以尝试使用函数str2num转换数字数组中的字符串:

  • 如果字符串仅包含nueric值,则可以将值累积存储在数组中
  • 如果转换失败,这意味着它是一个字符串,那么您可以将其累积存储在一个字符串中

您还可以设置一个标志并使用它来允许在找到字符串时在数字输出数组中插入一个值(例如NaN);这可以让您了解字符串在输入文件中的位置。

同样对于上述两种情况,您可以评估部分数字或字符串数​​组的长度,并将其存储在另一个数组中。

这使您可以了解输入文件中特定数字或字符串的位置。

在下面的内容中,您可以找到上述方法的可能实现方式。

% Open the input file
fp=fopen('mix_n_s.dat','r');
% Read the input file as a string in a cell array using "'" as a
% delimitator
% c=textscan(fp,'%s','delimiter','''');
c=textscan(fp,'%s','delimiter','''');
% Close the input file
fclose(fp);
% Extract the cell array
a=c{1};
% Initialize the output variables
% Array with the numeric values
numeric_array=[];
% String with the string in the input file
the_strings=[];
% Array with the number of numeric values and strings
the_cnt=[];
% Define the flag for enabling the isertion of NaN in the output numeric
% array in case a string is found
insert_nan=1;
% Scan the cellarray to extract the numbers and the strings
for i=1:length(a)
   x=a{i}
   % If the i-th element is empty (this occurs when there are at least two
   % consecutive string in the input file, do nothing
   if(~isempty(x))
      % If the i-th element is not empty try to convert it into a numeric array
      m=str2num(x);
      % If the output is not empty you have read one or more than one
      % numeric values
      if(~isempty(m));
         % Then store them into an array
         numeric_array=[numeric_array m];
         % The lengh of the array gives you the number of numeric values;
         % store it the array
         the_cnt=[the_cnt length(m)];
      else
         % If the conversin failed, you have read a string; store it in a
         % string 
         the_strings=[the_strings ' ' x];
         % Store the length of the string in the array; if you store it as
         % a negative value, you can recognise it later on
         the_cnt=[the_cnt -length(x)];
         % if the flag is on, then insert NaN in the numeric array
         if(insert_nan)
            numeric_array=[numeric_array NaN];
         end
      end
   end
end

numeric_array
the_strings
the_cnt

根据您提供的输入示例(我稍微修改了字符串):

1 0 23 'x' 'x' 'x' 0 0 0 1 1 10.3 54 123.45678 'x' 'x' 'x'

输出如下(inssert NaN的标志打开):

numeric_array =
  Columns 1 through 7
    1.0000         0   23.0000       NaN       NaN       NaN         0
  Columns 8 through 14
         0         0    1.0000    1.0000   10.3000   54.0000  123.4568
  Columns 15 through 17
       NaN       NaN       NaN


the_strings =
 x abcd efghilm x x x

the_cnt =
     3    -1    -4    -7     8    -1    -1    -1

可以解释如下:

  • 在输入文件中查看numeric_array数组:
    • 三个数值,然后是三个字符串,然后是八个数值和三个字符串
  • 查看the_cnt数组,您可以了解每个字符串的长度(丢弃-符号)。

希望这有帮助。

Qapla'