DLL et CSV

Résolu/Fermé
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021 - Modifié le 22 févr. 2021 à 13:05
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 - 20 avril 2021 à 09:52
Bonjour à tous !

Je suis entrain d'écrire une dll en C# pour faciliter l'utilisation de ce type de fichier. (Je ne peux pas utiliser une dll déjà faite)

Pour le moment je récupère les données de mon csv dans une list et j'essaye ensuite de récupérer une ligne de ma list à l'aide d'un match d'un string que je mets en paramètre.
A la base je voulais récupérer un index que je traiterais dans la fonction GetValue() mais si quelqu'un a une meilleure idée ...

Mes problèmes sont:
- Mon programme récupère seulement une cellule sur deux (et je ne vois pas pourquoi)
- Le match ne fonctionne pas, il passe à true pour toutes les cellules (ou presque) malgrès le regex
- Je souhaiterais enlever "nbColumn" et récupérer les colonnes jusqu'à ce que'il n'y est plus de valeurs ( essayé avec reader.EndOfData mais ça semble uniquement fonctionner avec les lignes )

Ci dessous le code en question :

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Microsoft.VisualBasic.FileIO;

namespace CSV
{
    public class CCSV
    {
        public List<List<string>> Tab;

        //Constructeur

        public void Load(string path, string separator)
        {
            Tab = new List<List<string>>(GetCol(path , separator));
        }

        private List<List<string>> GetCol(string path, string separator)   //Recupère le tableau dans une liste
        {

            List<List<string>> RegExValues = new List<List<string>>();
            int nbColumn = 27; //Faire en sorte que nbColumn s'arrete quand il n'y a plus de valeur dans les colonnes!!
            int i;
            string indexLine = "0";
            int count = 0;
            try
            {
               
                TextFieldParser reader = new TextFieldParser(path);
                reader.TextFieldType = FieldType.Delimited;
                reader.SetDelimiters(separator);
               

                while (!reader.EndOfData)
                {
                   
                        //Process row
                        List<string> AllDataLine = new List<string>(reader.ReadFields());
                        List<string> Line = new List<string>();
                        for ( i = 0; i < nbColumn; i++)
                        {
                            Line.Add(AllDataLine[i]);
                            i++;
                        }


                    if ( AllDataLine[0] != "LigneIndesirable") //Evite l'ajout de la ligne LigneIndésirable + ajoute une cellule "index"
                    {
                        indexLine = count.ToString();
                        Line.Add(indexLine);
                        count++;
                        RegExValues.Add(Line);
                    }

                    else
                    {
                        reader.ReadFields();
                    }
                }
                reader.Close();

            }
            catch (Exception ex)
            {
                //Gérer les erreur avec loggers
            }
            return RegExValues;


        }

        public string GetValue(string MLFB, string ValueName)
        {
            string result = "";

            return result;
        }


        public int GetIndex(string value)
        {
            int index = 0;
            int result = 0;

            foreach (List<string> line in Tab)
            {
                foreach (string col in line)
                {
                    Match match = Regex.Match(value, col); 
                    if (match.Success)
                    {
                        result = index;
                    }
                }
                index++;
            }

            return index;
        }

    }
}





Merci d'avance :)

24 réponses

Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 932
31 mars 2021 à 19:16
OK mais dans tes autres "vrais" fichiers c'est comment?
0
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021
31 mars 2021 à 19:42
Exactement comme celui que je t’ai envoyé en MP
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 932
31 mars 2021 à 20:32
Dans ce cas, il faut changer la regex.

Si c'est toujours Variable_ suivit du nom de la variable, alors la regex est
@"^Variable_\w+$"

0
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021
31 mars 2021 à 20:34
Et si je n’ai rien devant ne nom ?
C’est à dire pas de pattern défini ?
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 932
31 mars 2021 à 21:45
Le 1/03 je t'ai écrit
Bon j'aurais eu d'autres questions, mais j'ai émis des hypothèses (elles sont en commentaire dans le code).
Si elle ne sont pas exactes, faudra me le dire


Et ça n'est que maintenant, parce que volontairement je joue à l'idiot pour te forcer la main, que tu commences à esquisser
C’est à dire pas de pattern défini ?
ce qui sous entends qu'au moins une hypothèse n'est pas valable du tout (pas juste qu'il faut l'adapter un peu), mais tu ne le dis toujours pas clairement.

Je n'ai pas accès à tes fichiers (à part 2 morceaux dont je ne sais pas à quel point ils sont représentatifs). Je ne peux pas me faire une idée générale de ce qui pourrait marcher.
Donc quand je te dis "j'ai constaté... je pars sur cette base..." et que c'est faux, c'est toi qui perd du temps à ne pas le dire.

On est bien d'accord que le but c'est que l'opérateur n'ait pas à définir où commence chaque mesurande? (Et je veux une réponse claire)

Dans ce cas il faut trouver quelque chose de reproductible.

Au début, tu parlais des nombres à la fin des entêtes de la ligne 10.
Que tous les 1 correspondent à un mesurande, les 2 au suivant etc...

Est ce que ça, c'est toujours vrai? (Et je veux une réponse claire)



0
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021
1 avril 2021 à 08:33
Oui, j'avais bien lu, mais le problème est que je voulais réellement partir d'un fichier sous la forme du premier (avec varXXX) Mais j'ai découvert récemment que d'autres fichier n'ont pas la même forme. C'est à dire qu'ils n'ont pas de mots devant chaque Nom de variables , etc ...

Exemple :


Test Name:;;Nom;;;;;;;;;;;;No modification;;;;;Variable_dB;Test;;;Offset;;;
Test Nr:;;123;;;;;;;;;;;;Comments:;;;;;Variable Name;Offset_Modification;;;Offset;;;
Cost Center;;123*;;;;;;;;;;;;Control plan;;;;;Datatyp;1;;;1;;;
Modification date:;;20/03/2021;;;;;;;;;;;;;;;;;Distribution;1;;;1;;;
"Resp; of modif.:";;Moi.;;;;;;;;;;;;;;;;;Unit;mV;;;mV;;;
File Name;;Nom_123;;;;;;;;;;;;;;;;;Lower_limit ;85%;;;85%;;;
File Place;;C:\Temp;;;;;;;;;;;;;;;;;Upper_limit ;85%;;;85%;;;
;;;;;;;;;;;;;;;;;Doc;;Middle_Value_limit (in %);40;;;40;;;
;;;;;;;;;;;;;;;;;No document;;Standard_Dev_limit (in %);10;;;10;;;
Variant;Type;Bla;BlaBla;4;5;6;7;8;9;10;11;12;BlaBlaBla;MLFB_RegEx;Inspection_Plan;Inspection_Plan_Name;Inspection_Plan_Drawing_Index;Inspection_Order;Nber_of_Variable;Nominal_Value_1;Lower_Tol_1;Upper_Tol_1;Nominal_Value_2;Lower_Tol_2;Upper_Tol_2;Remark
ABC;P;BLA-.;UH;[48];0;.;.;.;A;.;.;22;;BLA-.UH[48]0...A..22;DEF-BLA-.UH[48]0...A..22;DEF 0,25 bar;1;DEF-.UH[48]0...A..22-1;2;-6,5;-1,5;1,5;0;-61;61;123
YZ;P;PLA-.;UH;[48];0;.;.;.;B;.;.;22;;PLA-.UH[48]0...B..22;XY-PLA-.UH[48]0...B..22;XY 1 bar;1;XY-.UH[48]0...B..22-1;2;-2,1;-0,9;0,9;0;-18;18;456


J'avais bien compris, mais ayant reçu des informations aux compte gouttes (différents fichiers etc...) c'était un peu trop flou pour moi, pour que je puisse te répondre efficacement. D'ailleurs, je m'en excuse.

Effectivement, le but final est que la personne qui va utiliser cette DLL aura juste à appeler une fonction du genre:

GetValue("La chaine Regex","Le nom du mesurande", "La colonne cherché");
OU
GetValue("Regex","Offset", "Upper_Tol");


Au début, tu parlais des nombres à la fin des entêtes de la ligne 10.
Que tous les 1 correspondent à un mesurande, les 2 au suivant etc...


Effectivement, C'est toujours vrai. D'où ma volonté de départ de récupérer ce chiffre.
Chaque mesurande aura un index en ligne 10, sous la forme :

;Nominal_Value_1;Lower_Tol_1;Upper_Tol_1;


Mais en fonction des fichiers, le nom de ces colonnes est amené à changer (en gardant l'index en fin)
Exemple pour un même mesurande:

;Value_1;Upp_Off_1;Lower_Tol_1;


Voilà voilà, j'espère avoir été assez claire cette fois ...
Merci d'avance pour tout.
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 932
5 avril 2021 à 16:06
Essaye ça
        /// <summary>
        /// Construit une instance de DonneeTheolit à partir d'un csv
        /// </summary>
        /// <param name="Filename"></param>
        public ImportDonneTheolit(string Filename)
        {
            filename = Filename;
            if (!File.Exists(Filename))
                throw new Exception("Fichier introuvable");

            if (Path.GetExtension(Filename).ToLower() != ".csv")
                throw new Exception("Mauvaise extension");

            //Lecture du fichier
            string[] lesLignes = File.ReadAllLines(Filename, Encoding.Default);

            //Hypothèse 1, les métadatas sont toujours dans les 10 premières lignes
            List<string[]> metadatas = (from l in lesLignes.Take(10)
                                        select l.Split(';')
                                        ).ToList();

            //les hypothèses 2 et 3 ne sont pas applicables à tous les fichiers

            //hypothèse 4, le modèle AAAA_XX de la dernière ligne de métadatas permet de générer les prototypes.
            //dans un premier temps en groupant les entêtes en fonction de XX
            //dans un seconde temps en en tirerant les prototypes
            var entetesIndexes = metadatas[9].Select((texte, ind) => new { texte, ind });
            List<PrototypeMesurande> prototypes = (from x in entetesIndexes
                        let m = Regex.Match(x.texte, @"^(?<entete>[\w_]+)_(?<numero>\d+)$")
                        where m.Success
                        group new { ind = x.ind, numero = m.Groups["numero"].Value, entete = m.Groups["entete"].Value } by m.Groups["numero"].Value into g

                        select new PrototypeMesurande(metadatas[0][g.First().ind], g.First().ind, g.Select(y => y.entete).ToArray())
                        ).ToList();

            //hypothèse 5, l'index de la colonne MLFB_RegEx change mais son nom reste le même
            int indexRegex = entetesIndexes.First(x => x.texte == "MLFB_RegEx").ind;

            //hypothèses 6, la dernière ligne du fichier est a exclure de l'import
            var import = lesLignes.Skip(10).ToList();//on exclue les 10 premières ligne du fichier
            import = import.Take(import.Count - 1).ToList();//on exclue la dernière ligne

            //import des données
            Datas = (from l in import
                     let split = l.Split(';')
                     select new DonneeTheolit(split[0], split[indexRegex], ToMesurandes(split, prototypes))
                     ).ToList();
        }

0
Theolit Messages postés 40 Date d'inscription mercredi 18 mars 2020 Statut Membre Dernière intervention 20 avril 2021
6 avril 2021 à 09:26
La récupération des données fonctionne !

Par contre:

 public Mesurande TrouveMesurande(string Nom, string DonneeRegex)
        {
            return Datas.FirstOrDefault(d => d.DonneeRegex == DonneeRegex)?.Mesurandes.FirstOrDefault(m => m.Nom == Nom);
        }


Me revoie "null" . (Mes valeurs sont bien dans le tableau.

Est ce que je dois ajouter un 'Regex.Match' pour faire correspondre d.DonneRegex et DonneRegex?
0