Défi n°9 : Validation de fichiers textes,
Venez coder en Matlab et relever le défi !

Le , par Jerome Briot, Rédacteur/Modérateur


Un nouveau défi inspiré d'une discussion d'un forum voisin : Traitement fichier txt

Le but consiste donc à écrire un code MATLAB qui va analyser des fichiers textes et vérifier pour chaque fichier les deux conditions suivantes :

  • condition n°1 : chaque ligne contient exactement 129 caractères (espace compris)
  • condition n°2 : le fichier se termine par une ligne vide


Je vous fourni 7 fichiers textes, nommés fichier01.txt … fichier07.txt (voir le fichier zip attaché)

Voici également un prototype de fonction que vous compléterez en ajoutant votre pseudo au nom de la fonction :

Code : Sélectionner tout
1
2
3
function isFilesOK = checkFilesBy%<VOTRE PSEUDO>% 
 
filesList = dir('fichier*.txt');
Vous placerez le fichier .m dans le dossier contenant les 7 fichiers txt.

La variable de sortie isFilesOK est un tableau de dimension 7x3. Chaque ligne correspond à un fichier. La première colonne correspond aux résultats de la condition n°1, la deuxième à ceux de la condition n°2. La troisième colonne est le résultat de la condition n°1 ET de la condition n°2 qui valide le contenu du fichier, comme demandé dans la discussion initiale.

Voici ce que vous devez obtenir pour les 7 fichiers txt fournis :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
isFilesOK = 
 
     1     1     1 
     0     1     0 
     1     0     0 
     0     1     0 
     1     1     1 
     0     0     0 
     1     1     1

----------------------------

Question subsidiaire

Ajoutez un bloc de code à la fin de la fonction checkFilesBy qui permettra, à partir du tableau isFilesOK de générer un fichier resultats.txt identique à ceci :

Code : Sélectionner tout
1
2
3
4
5
6
7
fichier01.txt OK 
fichier02.txt ERREUR 
fichier03.txt ERREUR 
fichier04.txt ERREUR 
fichier05.txt OK 
fichier06.txt ERREUR 
fichier07.txt OK
----------------------------

Vous posterez vos solutions à la suite de ce message.

Vous pouvez également poser vos questions si un point de l'énoncé ci-dessus ne vous parait pas clair ou bien si il y a une erreur.

----------------------------

Amusez-vous bien... ou pas


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de Gooby Gooby - Modérateur https://www.developpez.com
le 27/08/2014 à 17:40
Hello!

J'ai commencé la fonction, malheureusement je n'ai pas trouvé comment vérifier que la dernière ligne est une ligne vide, je ne sais même pas si c'est possible d'avoir l'information en utilisant la fonction importdata. Puis-je avoir un indice? Dois-je poster le début de ma fonction?
Avatar de Jerome Briot Jerome Briot - Rédacteur/Modérateur https://www.developpez.com
le 27/08/2014 à 19:37
Tu peux bien entendu poster ta solution sans la réponse à la question subsidiaire.

Un indice : analyser le code de la fonction ostxtfile
Avatar de Gooby Gooby - Modérateur https://www.developpez.com
le 28/08/2014 à 14:26
Hmmm j'ai peur que l'on s'est mal compris!

Tu peux bien entendu poster ta solution sans la réponse à la question subsidiaire.

Ce n'est pas sur la question subsidiaire sur laquelle je bloque mais sur la condition 2!

Un indice : analyser le code de la fonction ostxtfile

Avec plaisir, mais le lien que tu as posé renvoies vers la fonction repinfile, erreur de nom ou erreur de lien?

Je vais quand même jeter un œil sur repinfile quand j'aurai le temps, la fonction n'a pas l'air ni trop longue ni inabordable même pour mon petit niveau!

Merci de la réponse
Avatar de Jerome Briot Jerome Briot - Rédacteur/Modérateur https://www.developpez.com
le 28/08/2014 à 15:19
Citation Envoyé par Gooby  Voir le message
Hmmm j'ai peur que l'on s'est mal compris!

Effectivement

Pour le reste, le défi repose sur la définition de ce qu'est "une ligne" dans un fichier texte.
Comment un éditeur de texte classique sait-il qu'il faut afficher le fichier ligne après ligne et non pas tout le contenu sur une seule et même ligne ?
Avatar de Winjerome Winjerome - Expert éminent sénior https://www.developpez.com
le 07/09/2014 à 19:40
Bonsoir,

Voici ma contribution
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function isFilesOK = checkFilesByWinjerome  
 
nbChar = 129; 
resFile = 'resultats.txt'; 
 
filesList = dir('fichier*.txt'); 
nbFiles = numel(filesList); 
 
isFilesOK = false(nbFiles, 3); 
for k = 1:nbFiles 
    [fid message] = fopen(filesList(k).name , 'rt'); 
    if fid == -1 
        error('Erreur d''ouverture du fichier "%s" : %s',... 
              filesList(k).name, message) 
    end 
    data = fread(fid, [1 Inf], '*char'); 
    fclose(fid); 
 
    lines = regexp(data, '\n', 'split'); 
    isFilesOK(k,1) = all( nbChar == cellfun(@numel, lines(1:end-1)) ); 
    isFilesOK(k,2) = isempty(lines{end}); 
end 
isFilesOK(:,3) = isFilesOK(:,1) & isFilesOK(:,2); 
 
[fid message] = fopen(resFile, 'wt'); 
if fid == -1 
    error('Erreur d''ouverture du fichier %s : %s', resFile, message) 
end 
states = {'ERREUR', 'OK'}; 
content = [ {filesList(:).name} 
            states(isFilesOK(:,3) + 1) ]; 
fprintf(fid, '%s %s\n', content{:}); 
fclose(fid);
Avatar de Gooby Gooby - Modérateur https://www.developpez.com
le 10/09/2014 à 17:16
Intéressant ton script WinJerome, pour ma part j'étais bloqué à la condition 2: "le fichier se finit par une ligne vide"

Voici mon code, pas très intéressant lui
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function isFilesOK = checkFilesByGooby 
 
filesList = dir('fichier*.txt'); 
 
for i = 1:length(filesList) 
     
    datas{i,1} =  importdata(filesList(i).name); 
    V=1; 
    c=1; 
       
    while V==1 && c~=length(datas{i}); 
        if length(datas{i}{c}) ==129; 
            c=c+1; 
        elseif length(datas{i}{c}) ~=129; 
            V=0;       
        end 
    end 
     
end 
end
En regardant ta proposition, j'ai quelques questions qui me viennent. Quelles sont les différences entre les fonctions open et fopen? Pourquoi est il nécessaire d'effectuer un "fclose(fid)" ?
Avatar de Jerome Briot Jerome Briot - Rédacteur/Modérateur https://www.developpez.com
le 10/09/2014 à 17:19
Citation Envoyé par Gooby  Voir le message
Quelles sont les différences entre les fonctions open et fopen? Pourquoi est il nécessaire d'effectuer un "fclose(fid)" ?

Ouvre deux nouvelles discussions sur ces sujets dans le forum MATLAB et nous te répondrons avec grand plaisir

Au final, ça fera sans doute aussi deux nouvelles QR pour la FAQ ²
Avatar de johnette johnette - Nouveau membre du Club https://www.developpez.com
le 04/08/2016 à 12:00
Voici pour moi
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function isFilesOK = checkFilesBy %<johnette>% 
filesList = dir('fichier*.txt'); 
nbfil = size(filesList,1) 
for i = 1:nbfil 
    fid = fopen(filesList(i).name,'r'); 
    data = fread(fid, [1 Inf]); 
    data_2 = data(find(data ~= 13)); % Suppréssion du caractère CR 
    testcar = find(data_2==10); 
     
    if sum(mod(testcar,130))==0 %condition 129 ligne 
        isFilesOK(i,1) = true; 
    else 
        isFilesOK(i,1) = false; 
    end 
     
    if data_2(end)==10          %condition ligne vide 
        isFilesOK(i,2) = true; 
    else 
        isFilesOK(i,2) = false; 
    end 
end 
 
isFilesOK(:,3) = isFilesOK(:,1) & isFilesOK(:,2); % condition et 
end
Contacter le responsable de la rubrique MATLAB