我有一个非常大的数据集,它被分成文件夹,我有100个文件夹,每个文件夹大约有200个文本文件。我一直在尝试for循环首先导入一个然后在另一个命令导入其余的。但我对数据阵列不感兴趣,而是保留每个文件的名称,因为我必须匹配所有文件中的日期,每个文件的列数不同。
每个文本文件都与我附加的文件一样,我需要的数据是从第23行到第13列。
数据名称保存为010010.txt,010030.txt,010050.txt ......直到014957.txt,它们不是顺序的
除此之外,我创建了一个用于导入一个文件的脚本,但我想知道如何为其余文件重复相同的脚本。
filename = 'C:*\010010.txt';
startRow = 22;
formatSpec = '%4f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%6f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', '', 'WhiteSpace', '', 'HeaderLines' ,startRow-1, 'ReturnOnError', false);
fclose(fileID);
Untitled (010010) = [dataArray{1:end-1}];
我想重复相同的导入过程,但是对于其余文件。我将不胜感激任何建议
文本文件格式如下:
我只需要从第23行和第13列开始,每个txt文件都有不同的行数,因为有些数据来自1992 - 2014年,其他只有2000 - 2014年。第一列是年份,第2列到第13列是月份
答案 0 :(得分:0)
我猜您知道所有文件夹所在的基本路径。然后你可以使用这样的东西:
% First find all folders
folders = cell(0); % empty cell to save folder names
nFolders = 0;
allFolders = ls(basePath); % find all files and folders
for k=1:size(allFolders,1)
curFolder = fullfile(basePath,strtrim(allFolders(k,:)));
if isdir(curFolder) % find out if it is a folder
if ~(allFolders(k,1) == '.') % ignore '.' and '..'
folders{nFolders+1,1} = curFolder; % Save folder path
nFolders = nFolders + 1;
end
end
end
% Then find all files inside these folders
files = cell(0); % empty cell array for file names
nFiles = 0;
for k=1:nFolders % go through all folders
allFiles = ls(folders{k,1});
for l=1:size(allFiles,1) % go through all found files/subfolders
curFile = fullfile(folders{k},strtrim(allFiles(l,:)));
if ~isdir(curFile) % only select files
files{nFiles+1,1} = curFile; % and save it to the cell
nFiles = nFiles + 1;
end
end
end
现在,您可以遍历files
单元格并根据您的脚本读取所有文件。我看到你对文件名感兴趣。您可以通过
[path,filename,extension] = fileparts(files{k,1});
要导入文本文件,您可以使用dlmread
,我认为这比textscan
更直观(但当然有更多限制)。为此,您不必使用fopen
打开文件,您可以直接提供文件名。
value = dlmread(fileName,' ',[23,13,23,13]);
分隔符现在是一个空格,只读取row = 23 / col = 13的值。请注意,范围从row / col = 0开始,而不是像Matlab中通常那样1 - 所以也许你必须将它改为[22,12,22,12]
。