Je suis assez nouveau dans la programmation en c # et j'ai quelques problèmes pour traiter beaucoup de données dans plusieurs fichiers csv en un seul fichier xml.

Les fichiers csv que j'ai ressemblent à ceci:

"ID","NODE","PROCESS_STATE","TIME_STAMP","PREV_TIME_STAMP","CALCULATED"
206609474,2175,47,31.03.2015 00:01:25,31.03.2015 00:01:24,1
206609475,2175,47,31.03.2015 00:02:25,31.03.2015 00:01:25,1
206609476,2175,47,31.03.2015 00:03:25,31.03.2015 00:02:25,1

Dans un premier temps, je supprime toutes les entrées qui ne sont pas importantes pour mes calculs (par exemple, je supprime tous les fichiers qui ne contiennent pas de dates spécifiques) puis je sauvegarde à nouveau chaque fichier.

La deuxième étape consiste à fusionner tous ces fichiers préparés (~ 100) en un seul gros fichier csv.

Jusque-là, tout fonctionne plutôt bien et rapidement.

La dernière étape consiste à convertir le fichier csv en un fichier xml au format suivant:

<data-set>   
  <PDA_DATA>
    <ID>484261933</ID>
    <NODE>2190</NODE>
    <PROCESS_STATE>18</PROCESS_STATE>
    <PREV_TIME_STAMP>05.05.2016 22:53:41</PREV_TIME_STAMP>
  </PDA_DATA>   
  <PDA_DATA>
    <ID>484261935</ID>
    <NODE>2190</NODE>
    <PROCESS_STATE>47</PROCESS_STATE>
    <PREV_TIME_STAMP>06.05.2016 00:44:17</PREV_TIME_STAMP>   
  </PDA_DATA>
</data-set>

Comme vous pouvez le voir, je supprime des éléments ("TIME_STAMP", "CALCULATED") et plus encore, je supprime également toutes les entrées où l'entrée "TIME_STAMP" est égale à "PREV_TIME_STAMP". Je fais cela avec le code suivant:

string[] csvlines = File.ReadAllLines("All_Machines.csv");

XElement xml = new XElement("data-set",
    from str in csvlines
    let columns = str.Split(',')
    select new XElement("PDA_DATA",
        new XElement("ID", columns[0]),
        new XElement("NODE", columns[2]),
        new XElement("PROCESS_STATE", columns[5]),
        new XElement("TIME_STAMP", columns[6]),
        new XElement("PREV_TIME_STAMP", columns[9]),
        new XElement("CALCULATED", columns[10])));

// Remove unneccessray elements

xml.Elements("PDA_DATA")
    .Where(e => 
        e.Element("TIME_STAMP").Value.Equals(e.Element("PREV_TIME_STAMP").Value))
            .Remove();   // Remove entries with duration = 0

xml.Elements("PDA_DATA").Elements("TIME_STAMP").Remove();
xml.Elements("PDA_DATA").Elements("PREV_PROCESS_STATE").Remove();
xml.Elements("PDA_DATA").Elements("CALCULATED").Remove();
xml.Save("All_Machines.xml");

Et voici mon problème. Si j'exclus la ligne où je supprime les éléments où TimeStamp est égal à PrevTimeStamp, tout fonctionne assez bien et rapidement. Mais avec cette commande, cela prend beaucoup de temps et ne fonctionne qu'avec de petits fichiers csv.

Je n'ai aucune connaissance de la programmation économe en ressources, donc je serais très heureux si quelqu'un d'entre vous pouvait me dire où se situe le problème ou comment mieux le faire.

0
Aiye 17 janv. 2017 à 15:43

2 réponses

Meilleure réponse

Cela fonctionne beaucoup plus rapidement:

string[] csvlines = File.ReadAllLines("All_Machines.csv");

    XElement xml = new XElement("data-set",
        from str in csvlines
        let columns = str.Split(',')
        select new XElement("PDA_DATA",
            new XElement("ID", columns[0]),
            new XElement("NODE", columns[1]),
            new XElement("PROCESS_STATE", columns[2]),
            new XElement("TIME_STAMP", columns[3]),
            new XElement("PREV_TIME_STAMP", columns[4]),
            new XElement("CALCULATED", columns[5]),
                             )   
                            );

    // Remove unneccessray elements

        XElement xml2 = new XElement("data-set",                                       
                from el in xml.Elements() 
                where (el.Element("TIME_STAMP").Value != (el.Element("PREV_TIME_STAMP").Value))
                select el
                );

       xml2.Elements("PDA_DATA").Elements("TIME_STAMP").Remove();
       xml2.Elements("PDA_DATA").Elements("PREV_PROCESS_STATE").Remove();
       xml2.Elements("PDA_DATA").Elements("CALCULATED").Remove();
       xml2.Save("All_Machines.xml");

Toujours pas parfait pour les fichiers csv de plus de 150 Mo .. Avez-vous de meilleures suggestions?

0
Aiye 17 janv. 2017 à 14:49

Avec Cinchoo ETL - un framework open source, vous pouvez lire et écrire de gros fichiers CSV / Xml rapidement avec quelques lignes de code comme ci-dessous

using (var csv = new ChoCSVReader("NodeData.csv").WithFirstLineHeader(true)
    .WithFields("ID", "NODE", "PROCESS_STATE", "PREV_TIME_STAMP"))
{
    using (var xml = new ChoXmlWriter("NodeData.xml").WithXPath("data-set/PDA_DATA"))
        xml.Write(csv);
}

Le XML de sortie ressemble à

<data-set>
  <PDA_DATA>
    <ID>206609474</ID>
    <NODE>2175</NODE>
    <PROCESS_STATE>47</PROCESS_STATE>
    <PREV_TIME_STAMP>31.03.2015 00:01:25</PREV_TIME_STAMP>
  </PDA_DATA>
  <PDA_DATA>
    <ID>206609475</ID>
    <NODE>2175</NODE>
    <PROCESS_STATE>47</PROCESS_STATE>
    <PREV_TIME_STAMP>31.03.2015 00:02:25</PREV_TIME_STAMP>
  </PDA_DATA>
  <PDA_DATA>
    <ID>206609476</ID>
    <NODE>2175</NODE>
    <PROCESS_STATE>47</PROCESS_STATE>
    <PREV_TIME_STAMP>31.03.2015 00:03:25</PREV_TIME_STAMP>
  </PDA_DATA>
</data-set>

Divulgation: je suis l'auteur de cette bibliothèque

0
RajN 21 juil. 2017 à 00:05