J'ai plusieurs fichiers de données que, parfois, je veux supprimer les lignes de données supplémentaires inutiles, disons de la ligne 8000 à la dernière ligne. Je veux le faire pour tous les fichiers de données contenus dans les fichiers .txt. J'avais l'habitude de le faire manuellement, mais c'est un travail fastidieux de le faire fréquemment. J'ai combiné et modifié certains codes qui ont trouvé I en ligne, mais j'ai deux problèmes avec elle:Dans Matlab: comment supprimer une ligne de la ligne xxx à la fin du fichier dans plusieurs fichiers de données
- Je ne sais pas comment définir la plage, de sorte que le code supprimera toutes les lignes après la ligne 8000. jusqu'à la fin des données Par conséquent, j'ai supposé que le nombre de lignes à supprimer est un grand nombre (1000). Mais ce n'est pas une bonne solution, car le nombre total de lignes dans le fichier de données peut être supérieur à 9000.
- La deuxième chose est que je ne peux pas copier ou déplacer le fichier temporaire créé, qui contient les nouvelles données sans les lignes supplémentaires pour remplacer le fichier original :(J'ai trouvé l'identificateur unique universel (UUID) dans le dossier temporaire n'est pas le même que celui du "
outfile
" par exemple le code UUID pouroutfile
dans Matlab esttp58460076_aaad_4621_b2ac_c7036febc3f0
et dans le dossier temp il esttp30ade3f8_3abc_4e00_a2ef_26d67c5f836e
Je l'ai utilisé à la foiscopyfile
etmovefile
dans Matlab
Si quelqu'un a une solution de rechange ou sait ce qui ne va pas avec ce code, s'il vous plaît h elp!
close all
clear
clc
% Specify the folder where the files live.
myFolder = 'C:\Users\Emma\Data';
% Check to make sure that folder actually exists. Warn user if it doesn't.
if ~isdir(myFolder)
errorMessage = sprintf('Error: The following folder does not exist:\n%s', myFolder);
uiwait(warndlg(errorMessage));
return;
end
% Get a list of all files in the folder with the desired file name pattern.
filePattern = fullfile(myFolder, '*.txt'); % Change to whatever pattern you need.
theFiles = dir(filePattern);
for k = 1 : length(theFiles)
baseFileName = theFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
%*****************************
first_line_to_delete = 8003;
num_lines_to_delete = 1000;
infilename = fullFileName;
[pathstr, file, ext] = fileparts(infilename);
backfile = fullfile(pathstr, [file '.bak']);
if strcmp(infilename, backfile)
error('I refuse to edit a backup file! Nothing has been changed.');
end
outfile = tempname; %a temporary file in TMP directory
fin = fopen(infilename, 'r');
if fin < 0; error('Input file does not exist'); end
fout = fopen(tempname, 'w');
if fout < 0
fclose(fin);
error('Could not open temporary output file');
end
%read lines before the one to be deleted and write them to output
for K = 1 : first_line_to_delete - 1;
inline = fgets(fin);
if ~ischar(inline); break; end; %end of file?
fwrite(fout, inline);
end
for K = 1 : num_lines_to_delete;
if ~ischar(inline); break; end %in case EOF
inline = fgets(fin); %and do nothing with it
end
%copy all remaining input lines to output file
while ischar(inline)
inline = fgets(fin);
if ischar(inline) %not if we hit EOF
fwrite(fout, inline);
end
end
fclose(fin);
fclose(fout);
%we did the copying and have a file with the desired
%result. Now put it in the proper place
[status,message,messageId] = copyfile(infilename, backfile, 'f'); %Emma mod
if ~status
if strcmp(infilename, backfile)
fprintf(2, 'Good thing your programmer is paranoid about people overriding\nsanity checks, because something went wrong and you nearly lost your file!\n');
else
delete(backfile);
end
error('Could not rename file to .bak, file left untouched');
else
[status,message,messageId] = copyfile(fullfile(outfile, [myFolder, infilename]), 'f');
if ~status
error(['Could not rename temp file to original name, original moved to ', backfile]);
end
end
%**************************
end
http://stackoverflow.com/questions/19017994/how-do-i-limit-or-truncate-text-file -by-number-of-lines. Sinon, supprimez simplement la boucle 'for K = ...' et la boucle 'while while ischar ...' entièrement. – beaker
@beaker Merci beaucoup! Un script shell d'une ligne a remplacé ce long code Matlab :) Heureusement j'ai accès à un terminal! – Emma