【问题标题】:Reading Data from more than 2000 txt files in matlab在matlab中从2000多个txt文件中读取数据
【发布时间】:2014-08-19 17:38:52
【问题描述】:

我有超过 3000 个数据 txt 文件。我根据特殊费率为这些文件创建名称 h=[1]; k+=[0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5]; K-T=[1e-6 0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5]; K-D=[1e-6 0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];

像这样的每个文件的名称 (MTN100_k+0.1_k-T_0.1_k-D0.4_h1_GTP0.txt) 我如何在 Matlab 中读取这些文件。我需要分别处理每个文件。我尝试使用 dlmread 和 fscan 但没有帮助。我需要一些编程,只需编写一个算法来自动生成正确的文件名。

例如,如果我的文件名是:

MTN100_k+0.1_k-T_0.1_k-D0.4_h1_GTP0.txt)

MTN100_k+0.1_k-T_0.1_k-D0.7_h1_GTP0.txt)

MTN100_k+0.1_k-T_0.1_k-D1_h1_GTP0.txt)

h1 和 GTP0 是固定的,我只需要更改 k+,k-T,k-D。我主要使用 C++,并不真正熟悉如何在 MATLAB 中做类似的事情。任何帮助将不胜感激。我会很感激你的。

【问题讨论】:

  • 使用dir获取.txt的文件列表,然后使用for循环遍历每个文件名并加载数据。

标签: matlab


【解决方案1】:

Salam 3lykum!

一般来说,你应该按照rayryeng​​em>在他的评论中建议的去做,可以这样做:

cd(fullPathOfTheFolderWithTheTxtFiles);
filenames0 = dir('*.txt');
filenames0 = {filenames0.name}'; ...'//See documentation of dir.

请参阅:cddir

但是,如果您对如何以编程方式生成文件名列表感兴趣,我将提供以下答案。

我假设所有可能的文件名组合都存在于k+k-TK-D

为了便于解释,我们定义3个向量如下:

k_plus =[0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];
K_minus_T = [1e-6 0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];
K_minus_D = [1e-6 0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];

我首先要做的是生成all possible combinations of these vectors的列表:

sets = {k_plus, K_minus_T, K_minus_D};
[x,y,z] = ndgrid(sets{:});
cartProd = [x(:) y(:) z(:)];

接下来,您可以编写一个循环,或者使用一个不太容易阅读的矢量化版本来执行此操作:

 %// Loop Version:
nFiles = size(cartProd,1);
filenames1{nFiles,1}=[]; %// Preallocation
for ind1=1:nFiles
    filenames1{ind1} = ['MTN100_' ...
        'k+'  num2str(cartProd(ind1,1)) '_' ...
        'k-T' num2str(cartProd(ind1,2)) '_' ...
        'k-D' num2str(cartProd(ind1,3)) '_' ...
        'GTP0.txt'];
end
%// Vectorized Version:
filenames2=cellstr([repmat('MTN100_k+',[nFiles,1]) num2str(cartProd(:,1)) ...
                    repmat('_k-T',[nFiles,1]) num2str(cartProd(:,2)) ...
                    repmat('_k-D',[nFiles,1]) num2str(cartProd(:,3)) ...
                    repmat('_GTP0.txt',[nFiles,1])]);    

然后您可以遍历生成的数组并对文件执行任何您需要的操作。

或者,如果您想查找特定值组合的文件名,您可以使用以下内容:

kP_wanted = k_plus(4);
kT_wanted = K_minus_T(9);
kD_wanted = K_minus_D(2);

filenames{intersect(intersect(find(cartProd(:,1)==kP_wanted),...
                              find(cartProd(:,2)==kT_wanted)),...
                              find(cartProd(:,3)==kD_wanted))}

【讨论】:

  • 感谢 Dev-iL,您的代码真的很有帮助。我对其进行了一些更改,并获得了所需的文件名。不幸的是,我试图读取循环内的每个文件,但我做不到。我用了 txtread ,txtscan 但它不起作用。
  • 亲爱的 Dev-iL ,我把我在你的评论中使用的代码。我尝试使用 fopen , tx=textread,textscan 来读取他的数据,但它不起作用。我想知道你是否可以帮助我。
  • 看起来原来获取文件名的问题已经解决了,不是吗?至于 textread\textscan,那就另当别论了,可以考虑单独发帖。
【解决方案2】:
 clc;
    clear all;
    close all;
    %%
    h=[1];
    k_plus =[0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];
    K_minus_T =[1e-6 0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];
    K_minus_D = [1e-6 0.1 0.2 0.4 0.7 1 1.1 1.2 1.5 1.7 2 2.5 3 3.5 4 5];
    sets = {k_plus, K_minus_T, K_minus_D,h};
    [x,y,z r] = ndgrid(sets{:});
    cartProd = [x(:) y(:) z(:) r(:)];
    nFiles = size(cartProd,1);
    filename{nFiles,1}=[];
    for i=1:nFiles
        filename{i} = ['MTN100_' ...        
            'k+'  num2str(cartProd(i,1)) '_' ...
            'k-T_' num2str(cartProd(i,2)) '_' ...
            'k-D' num2str(cartProd(i,3)) '_' ...
            'h'  num2str(cartProd(i,4)) '_' ...
            'GTP0.txt'];
            end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多