Recuperer des données

Fermé
Utilisateur anonyme - 22 juin 2015 à 20:18
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 14 juil. 2015 à 18:40
Bonsoire tous l monde,

mon probleme est le suivant:7

enfaite je suis debutant au java, et je voudrais recuperer toute les valeur contenue dans une ligne d'un fichier texte quiu contien 41 valeur. pour cela j ai crée un type "connection" qui contien 41 attribue.

voila quelque ligne de mon fichier txt

ligne01:0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,normal.

ligne02:0,tcp,http,SF,239,486,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,19,19,1.00,0.00,0.05,0.00,0.00,0.00,0.00,0.00,normal.

ligne03:0,tcp,http,SF,235,1337,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,29,29,1.00,0.00,0.03,0.00,0.00,0.00,0.00,0.00,normal.


voila le code de ma classe connection.

public class connexion
{
int nom;
boolean traite;/*est utilisé dans centre mobile*/
double x1; int x2;int x3;int x4;double x5;double x6;double x7;double x8;double x9;double x10;double x11;double x12;double x13;double x14;double x15;double x16;double x17;double x18;double x19;double x20;double x21;double x22;double x23;double x24;double x25;double x26;double x27;double x28;double x29;double x30;double x31;double x32;double x33;double x34;double x35;double x36;double x37;double x38;double x39;double x40;double x41;

connexion(double a1, int a2, int a3, int a4, double a5, double a6, double a7, double a8, double a9, double a10, double a11,
double a12, double a13, double a14, double a15, double a16, double a17, double a18, double a19, double a20, double a21,
double a22, double a23, double a24, double a25, double a26, double a27, double a28, double a29, double a30, double a31,
double a32, double a33, double a34, double a35, double a36, double a37, double a38, double a39, double a40, double a41)
{
x1 = a1; x2 = a2; x3 = a3; x4 = a4; x5 = a5; x6 = a6; x7 = a7; x8 = a8; x9 = a9; x10 = a10; x11 = a11; x12 = a12;
x13 = a13;x32 = a32; x33 = a33; x34 = a34; x35 = a35; x36 = a36; x37 = a37; x38 = a38; x39 = a39; x40 = a40;
x41 = a41;

}
/****************************/

public connexion()
{
//
// TODO: Add Constructor Logic here
//
}
/*************/
connexion(int a0, double a1, int a2, int a3, int a4, double a5, double a6, double a7, double a8, double a9, double a10,
double a11, double a12, double a13, double a14, double a15, double a16, double a17, double a18, double a19, double a20,
double a21, double a22, double a23, double a24, double a25, double a26, double a27, double a28, double a29, double a30,
double a31, double a32, double a33, double a34, double a35, double a36, double a37, double a38, double a39, double a40,
double a41)
{
nom = a0;
traite = false;
x1 = a1; x2 = a2; x3 = a3; x4 = a4; x5 = a5; x6 = a6; x7 = a7; x8 = a8; x9 = a9; x10 = a10; x11 = a11; x12 = a12; x13 = a13;
x14 = a14; x15 = a15; x16 = a16; x17 = a17; x18 = a18; x19 = a19; x20 = a20; x21 = a21; x22 = a22; x23 = a23; x24 = a24;
x25 = a25; x26 = a26; x27 = a27; x28 = a28; x29 = a29; x30 = a30; x31 = a31; x32 = a32; x33 = a33; x34 = a34; x35 = a35;
x36 = a36; x37 = a37; x38 = a38; x39 = a39; x40 = a40; x41 = a41;

}


}

Déja 4 semaine que je cherche (sans relâche) sur tous les forums et site spécialisés, pas moyen de trouver un tuto compréhensible

Si quelqu'un s'y connait un peu...

Merci d'avance

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
22 juin 2015 à 20:26
Bonjour,

"un fichier texte quiu contien 41 valeur. pour cela j ai crée un type "connection" qui contien 41 attribue."
Et que se passera-t-il le jour où tu auras 500, ou 2000 valeurs ? Tu feras aussi des classes avec 500 ou 2000 attributs ?

String line = "ligne01:0,tcp,http,SF,181,5450,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,9,9,1.00,0.00,0.11,0.00,0.00,0.00,0.00,0.00,normal.";
String[] tab = line.split(",");

Un seul attribut, 41 valeurs dedans (42 en réalité !)

Sinon, c'était quoi la question ?
0
je veur realeser un IDS et pour cela je doit mettre ces valeur contenue dans cette ligne dans la meme variable "une variable connection qui contien 41 attribue"

le truc c'est que je doit traiter plusieur ligne qui se trouve dans un fichier txt
0
Utilisateur anonyme
22 juin 2015 à 20:42
en plus mes ligne en realité c'est des connection qui contien que 41 attribue et qui ne peut changer
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
22 juin 2015 à 21:16
Quand on commence à avoir un grand nombre de valeurs à traiter, il faut raisonner autrement, maintenir 41 attributs, 41 getteurs, 41 setteurs, ou pire un constructeur à 41 arguments, c'est ingérable.

Je propose de mettre en place une Map<K,V> où K sera un enum et V probablement Object vu la diversité de tes types. L'enum te permettra de gérer plusieurs informations comme le nom de la valeur, son type de donnée, ou sa position dans la ligne.

Alors, ça demande un peu de code au départ, mais après c'est super souple à utiliser.

Exemple :

import java.util.IdentityHashMap;
import java.util.Map;

public class Test {
    
    public static void main(String[] args) {
        Connection conn = new Connection("1;23.45", ";");

        System.out.println(conn.get(ConnectionParameter.PREMIER_PARAMETRE_QUI_EST_ENTIER));  // 1
        System.out.println(conn.get(ConnectionParameter.DEUXIEME_PARAMETRE_QUI_EST_DOUBLE)); // 23.45
    }
}

interface ConnectionParser {
    public Object fromString(String str);

    public String asString(Object obj);

    public Class<?> getParserType();
}

enum ConnectionParameter implements ConnectionParser {
    PREMIER_PARAMETRE_QUI_EST_ENTIER(ConnectionTransformer.INTEGER), // 0
    DEUXIEME_PARAMETRE_QUI_EST_DOUBLE(ConnectionTransformer.DOUBLE); // 1

    private final ConnectionTransformer transformer;

    ConnectionParameter(ConnectionTransformer transformer) {
        this.transformer = transformer;
    }

    @Override
    public Object fromString(String str) {
        return transformer.fromString(str);
    }

    @Override
    public String asString(Object obj) {
        return transformer.asString(obj);
    }

    @Override
    public Class<?> getParserType() {
        return transformer.getParserType();
    }
}

enum ConnectionTransformer implements ConnectionParser {
    INTEGER() {
        @Override
        public Object fromString(String str) {
            return Integer.parseInt(str);
        }

        @Override
        public String asString(Object obj) {
            return Integer.toString((Integer) obj);
        }

        @Override
        public Class<?> getParserType() {
            return int.class;
        }
    },
    DOUBLE() {
        @Override
        public Object fromString(String str) {
            return Double.parseDouble(str);
        }

        @Override
        public String asString(Object obj) {
            return Double.toString((Double) obj);
        }

        @Override
        public Class<?> getParserType() {
            return double.class;
        }
    };
}

class Connection {

    private final Map<ConnectionParameter, Object> parameters;

    public Connection() {
        parameters = new IdentityHashMap<ConnectionParameter, Object>(ConnectionParameter.values().length);
    }

    public Connection(String[] values) {
        this();
        ConnectionParameter[] parameterValues = ConnectionParameter.values();
        if (values.length != parameterValues.length)
            throw new IllegalArgumentException();
        for (int i = 0; i < parameterValues.length; i++)
            putFromString(parameterValues[i], values[i]);
    }

    public Connection(String line, String delimiter) {
        this(line.split(delimiter));
    }

    public void put(ConnectionParameter parameter, Object value) {
        parameters.put(parameter, value);
    }

    public void putFromString(ConnectionParameter parameter, String value) {
        put(parameter, parameter.fromString(value));
    }

    public Object get(ConnectionParameter parameter) {
        return parameters.get(parameter);
    }
}
0
Utilisateur anonyme
23 juin 2015 à 13:23
Merci pour le code c'est vraiment souple et facile mais le travail que je veut faire consiste:

-recuperer toutes les valeur contenue dans la meme ligne a une seul variable qui contien attribue

-cette variable va representer ensuite un point dans un graphe de Clustering (k-means)


par exemple a c'est la variable et X14 c'est l'attribue numero 14 de la variable a donc on accede a de cette maniere a.X14.


merci :)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 juin 2015 à 20:28
par exemple a c'est la variable et X14 c'est l'attribue numero 14 de la variable a donc on accede a de cette maniere a.X14.
Avec mon code d'hier :

Connection a = ...
Object res = a.get(ConnectionParameter.X14);

Il faut juste que X14 soit déclaré dans l'enum (en 14è position) avec son type de donnée associée, comme dans mon exemple.
0
DjimM Messages postés 8 Date d'inscription mardi 5 mai 2015 Statut Membre Dernière intervention 13 juillet 2015
28 juin 2015 à 12:37
merci une autre fois pour le code mais le probleme est quand je remplace le fichier text que vous avez saisez "1;23.45", ";" avec celui la ça "rest0,tcp,http,SF,235,1337,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,8,8,0.00,0.00,0.00,0.00,1.00,0.00,0.00,29,29,1.00,0.00,0.03,0.00,0.00,0.00,0.00,0.00,normal.
" ne marche plus
merci d avvance
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
28 juin 2015 à 12:45
Evidemment que ça ne marche plus, ce n'était qu'un exemple !

J'avais pris "1;23.45" car cela correspondait à mon enum :

enum ConnectionParameter implements ConnectionParser {
    PREMIER_PARAMETRE_QUI_EST_ENTIER(ConnectionTransformer.INTEGER), // 0
    DEUXIEME_PARAMETRE_QUI_EST_DOUBLE(ConnectionTransformer.DOUBLE); // 1

Pour que ça fonctionne chez toi avec ta String à 41 champs, il faut modifier cet enum pour qu'elle ait 41 valeurs, et quelle parse les différents champs avec le type que tu veux.

Remarque : moi j'ai créé deux types INTEGER et DOUBLE pour mon exemple, si tu as besoin d'autres types de données, il faudra les rajouter dans la deuxième enum pour déterminer de quelle manière la String doit être parsée.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
Modifié par KX le 28/06/2015 à 13:28
Par exemple, dans ton cas :

enum ConnectionParameter implements ConnectionParser {
    X1_STRING(ConnectionTransformer.STRING), // rest0
    X2_STRING(ConnectionTransformer.STRING), // tcp
    X3_STRING(ConnectionTransformer.STRING), // http
    X4_STRING(ConnectionTransformer.STRING), // SF
    X5_INTEGER(ConnectionTransformer.INTEGER), // 235
    X6_INTEGER(ConnectionTransformer.INTEGER), // 1337
    ...

Et il faut rajouter STRING dans ConnectionTransformer :

     STRING() {
        @Override
        public Object fromString(String str) {
            return str;
        }

        @Override
        public String asString(Object obj) {
            return (String) obj;
        }

        @Override
        public Class<?> getParserType() {
            return String.class;
        }
    }

Remarque : avant que tu ne poses la question, pour mon exemple j'avais "1;23.45" et je découpais les champs sur le point virgule. Vu ta chaîne il faut faire le découpage sur une virgule, ce paramétrage se fait au tout début du code :

public static void main(String[] args) {
    Connection conn = new Connection("1;23.45", ";");

public static void main(String[] args) {
    Connection conn = new Connection("rest0,tcp,http,SF,235,1337...", ",");
    String x1 = (String) conn.get(ConnectionParameter.X1_STRING);  // rest0
    int x5 = (int) conn.get(ConnectionParameter.X5_INTEGER); // 235
0