2017-05-13 2 views
0

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

  1. 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.
  2. 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 pour outfile dans Matlab est tp58460076_aaad_4621_b2ac_c7036febc3f0 et dans le dossier temp il est tp30ade3f8_3abc_4e00_a2ef_26d67c5f836e Je l'ai utilisé à la fois copyfile et movefile 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 
+0

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

+0

@beaker Merci beaucoup! Un script shell d'une ligne a remplacé ce long code Matlab :) Heureusement j'ai accès à un terminal! – Emma

Répondre

0

La réponse à cette question est la commande suivante:

sed -i '8003,$ d' *.txt