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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
package miseEnFormeDonneesCSV;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import com.opencsv.CSVReader;
public class Convertisseur_CSV {
public static String type;
public static String file;
public static String fis2;
public static final int nbEquip = 9;
public static <printStream> void main(String[] args) throws IOException {
String inputFile = "C:/wamp/www/Klog/Klog/capt.klog";
String outputFileCSV = "C:/wamp/www/Klog/Temp/";
boolean frLang = true; // si les logs bruts ont ete enregistres avec la langue francaise... (false = us)
// Ecriture fichiers CSV pour chaque groupe d'équipements.
String[] nomEquip = {"eclairages_ferme", "eclairages_ouvert", "variateurs_ferme", "variateurs_ouvert", "volets_ouvert", "volets_ferme", "portes_ferme", "portes_ouvert", "fenetres_actions"};
int i = 0;
File[] files = new File[nbEquip];
FileOutputStream[] fis = new FileOutputStream[nbEquip];
PrintStream[] outs = new PrintStream[nbEquip];
for (String nEquipe : nomEquip){
files[i] = new File(outputFileCSV + nEquipe + ".csv");
fis[i] = new FileOutputStream(files[i]);
outs[i] = new PrintStream(fis[i]);
i++;
}
ParserFichier klogParser = new ParserFichier();
klogParser.parse(inputFile, frLang, outs);
String[] equip = {"eclairages_ferme","eclairages_ouvert","volets_ouvert","volets_ferme","portes_ouvert","portes_ferme","variateurs_ouvert","variateurs_ferme"};
for (String type : equip){
String fichierIn = "C:/wamp/www/Klog/Temp/" + type + ".csv";//Variable fichierIn de type String contenant le chemin du fichier csv source
File fichierCSV = new File(fichierIn);//Création objet fichierCSV de type File dans le quel on met fichierIn
List<String[]> myEntries; //myEntries est une liste de Liste de tableau de String
try (CSVReader reader = new CSVReader(new FileReader(fichierCSV))) {//reader est un objet de classe CSVReader auquel on passe le fichierIn en argument
myEntries = reader.readAll(); //Le contenu du fichierIn lu est passé dans myEntries
List<Donnees> listDistinct = myEntries.stream() // myEntries c'est une List<String[]> qu'on convertit en Stream<String[]>
.skip(1)//on saute la 1ere ligne d'entête
.map(Donnees::new) // qu'on converti en Stream<Donnee>
.collect(Collectors.groupingBy(Donnees::getDate,
Collectors.groupingBy(Donnees::getTime,
Collectors.groupingBy(Donnees::getEquipement)))) // on obtient une map de clef date, dont les valeurs sont des maps de clef time, donc les valeurs sont des map de clef equipement, donc les valeurs sont des listes de données
.values().stream() // les maps de clef "Heure" (et valeur, un map de clef equipement et valeur liste de donnees
.flatMap(m-> m.values().stream()) // qu'on transforme en stream de Map de clef equipement
.flatMap(m-> m.values().stream()) // qu'on transforme en stream de de liste de données
.flatMap(listEquipement-> listEquipement.stream()) // qu'on transforme en stream de données
.collect(Collectors.toList()); // on transforme le stream résultant en liste (de données) (List<Donnees>)
Map<LocalDate, Map<LocalTime, Map<String, Long>>> map = listDistinct.stream() // on parcourt la liste de Donnees par stream
.collect(Collectors.groupingBy(Donnees::getDate, // on groupe d'abord par date
Collectors.groupingBy( Donnees::getTime, // puis par heure
Collectors.groupingBy(Donnees::getEquipement,
Collectors.reducing(0L, a->1L, (a,b)->1L)
)))); // puis par équipement, , on obtient une Map<LocalDate, Map<LocalTime, Map<String, List<Donnees>>>>
Set<String> equipements = map.entrySet().stream()
.flatMap(edate-> edate.getValue().entrySet().stream()) // entries dans la sous map (des <LocalTime,Map<String, Long>) // C'EST ÇA LE NIVEAU EN PLUS
.flatMap(etime -> etime.getValue().keySet().stream()) // entries dans la sous sous map
.collect(Collectors.toCollection(TreeSet::new));
for (String equipe1 : equipements)
{
String csv = "C:/wamp/www/Klog/Data/" + equipe1 + ".csv";
File fichierOut = new File(csv);
PrintStream out = new PrintStream(new FileOutputStream (fichierOut));
out.println("date," + equipe1); //Ecriture de l'entête
//Code permettant la mise en formme de le date et des données pour chaque ligne du csv avec "0" considéré comme "null"
map.entrySet().stream().sorted(Map.Entry.comparingByKey())
.forEach(edate -> edate.getValue().entrySet().stream().sorted(Map.Entry.comparingByKey())
.peek(etime-> out.print(edate .getKey().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " " + etime.getKey().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + ",")) // time,
.forEach(etime-> out.println(etime.getValue().get(equipe1))));
out.close();
}
}
catch (NumberFormatException e){
System.out.println("not a number");
}
}
}
} |
Partager