Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SimpleCsvReaderWriter.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* SimpleCsvReaderWriter.cc (C) 2000-2022 */
9/* */
10/* Classe permettant de lire et d'écrire un fichier au format csv. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/std/SimpleCsvReaderWriter.h"
15
16#include "arcane/Directory.h"
17#include "arcane/utils/Iostream.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
30{
31 std::ofstream ofile((dst.file(file_name) + "." + fileType()).localstr());
32 if (ofile.fail())
33 return false;
34
35 _print(ofile);
36
37 ofile.close();
38 return true;
39}
40
42readTable(const Directory& src, const String& file_name)
43{
45
46 std::ifstream stream;
47
48 // S'il n'y a pas de fichier, on retourne false.
49 if (!_openFile(stream, src, file_name + "." + fileType())) {
50 return false;
51 }
52
53 std::string line;
54
55 // S'il n'y a pas de première ligne, on arrête là.
56 // Un fichier écrit par SimpleCsvOutput possède toujours au
57 // moins une ligne.
58 if (!std::getline(stream, line)) {
59 _closeFile(stream);
60 return false;
61 }
62
63 // Sinon, on a la ligne d'entête, contenant les noms
64 // des colonnes (et le nom du tableau).
65 String ligne(line);
66
67 {
69 ligne.split(tmp, m_separator);
70
71 if (tmp.size() == 0) {
72 _closeFile(stream);
73 return false;
74 }
75
76 m_simple_table_internal->m_table_name = tmp[0];
77 m_simple_table_internal->m_column_names = tmp.subConstView(1, tmp.size());
78 }
79
80 // S'il n'y a pas d'autres lignes, c'est qu'il n'y a que des
81 // colonnes vides (ou aucunes colonnes) et aucunes lignes.
82 if (!std::getline(stream, line)) {
83 _closeFile(stream);
84 return true;
85 }
86
87 // Maintenant que l'on a le nombre de colonnes, on peut définir
88 // la dimension 2 du tableau de valeurs.
89 m_simple_table_internal->m_values.resize(1, m_simple_table_internal->m_column_names.size());
90
91 Integer compt_line = 0;
92
93 do {
94 // On n'a pas le nombre de lignes en avance,
95 // donc on doit resize à chaque tour.
96 m_simple_table_internal->m_values.resize(compt_line + 1);
97
98 // On split la ligne récupérée.
100 String ligne(line);
101 ligne.split(splitted_line, m_separator);
102
103 // S'il y a une ligne vide, on l'a passe.
104 if (splitted_line.size() == 0) {
105 continue;
106 }
107
108 // Si le nombre de colonnes de la ligne ne correspond pas au nombre
109 // de nom de colonnes, il y a une erreur dans le fichier.
110 if (splitted_line.size() != m_simple_table_internal->m_column_names.size() + 1) {
111 _closeFile(stream);
112 return false;
113 }
114
115 // Le premier élement est le nom de ligne.
116 m_simple_table_internal->m_row_names.add(splitted_line[0]);
117
118 // Les autres élements sont des Reals.
119 for (Integer i = 1; i < splitted_line.size(); i++) {
120 std::string std_string = splitted_line[i].localstr();
121 std::size_t pos_comma = std_string.find(',');
122
123 if (pos_comma != std::string::npos) {
124 std_string[pos_comma] = '.';
125 }
126
127 m_simple_table_internal->m_values[compt_line][i - 1] = std::stod(std_string);
128 }
129
130 compt_line++;
131 } while (std::getline(stream, line));
132
133 _closeFile(stream);
134
135 // On n'a pas sauvegardé les tailles des lignes/colonnes donc on met la taille max
136 // pour chaque ligne/colonne.
137 m_simple_table_internal->m_row_sizes.resize(m_simple_table_internal->m_row_names.size());
138 m_simple_table_internal->m_row_sizes.fill(m_simple_table_internal->m_values.dim2Size());
139
140 m_simple_table_internal->m_column_sizes.resize(m_simple_table_internal->m_column_names.size());
141 m_simple_table_internal->m_column_sizes.fill(m_simple_table_internal->m_values.dim1Size());
142
143 return true;
144}
145
148{
149 m_simple_table_internal->clear();
150}
151
153print()
154{
155 _print(std::cout);
156}
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
162precision()
163{
164 return m_precision_print;
165}
166
168setPrecision(Integer precision)
169{
170 if (precision < 1)
171 m_precision_print = 1;
172 else if (precision > (std::numeric_limits<Real>::max_digits10))
173 m_precision_print = (std::numeric_limits<Real>::max_digits10);
174 else
175 m_precision_print = precision;
176}
177
179isFixed()
180{
181 return m_is_fixed_print;
182}
183
185setFixed(bool fixed)
186{
187 m_is_fixed_print = fixed;
188}
189
192{
193 return m_scientific_notation;
194}
195
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
206internal()
207{
208 return m_simple_table_internal;
209}
210
213{
214 if (simple_table_internal.isNull())
215 ARCANE_FATAL("La réference passée en paramètre est Null.");
216 m_simple_table_internal = simple_table_internal;
217}
218
219/*---------------------------------------------------------------------------*/
220/*---------------------------------------------------------------------------*/
221
222bool SimpleCsvReaderWriter::
223_openFile(std::ifstream& stream, Directory directory, const String& file)
224{
225 stream.open(directory.file(file).localstr(), std::ifstream::in);
226 return stream.good();
227}
228
229void SimpleCsvReaderWriter::
230_closeFile(std::ifstream& stream)
231{
232 stream.close();
233}
234
235void SimpleCsvReaderWriter::
236_print(std::ostream& stream)
237{
238 // On enregistre les infos du stream pour les restaurer à la fin.
239 std::ios_base::fmtflags save_flags = stream.flags();
240 std::streamsize save_prec = stream.precision();
241
242 if (m_is_fixed_print) {
243 stream << std::setiosflags(std::ios::fixed);
244 }
245 if (m_scientific_notation) {
246 stream << std::scientific;
247 }
248 stream << std::setprecision(m_precision_print);
249
250 stream << m_simple_table_internal->m_table_name << m_separator;
251
252 for (Integer j = 0; j < m_simple_table_internal->m_column_names.size(); j++) {
253 stream << m_simple_table_internal->m_column_names[j] << m_separator;
254 }
255 stream << std::endl;
256
257 for (Integer i = 0; i < m_simple_table_internal->m_values.dim1Size(); i++) {
258 stream << m_simple_table_internal->m_row_names[i] << m_separator;
259 ConstArrayView<Real> view = m_simple_table_internal->m_values[i];
260 for (Integer j = 0; j < m_simple_table_internal->m_values.dim2Size(); j++) {
261 stream << view[j] << m_separator;
262 }
263 stream << std::endl;
264 }
265
266 stream.flags(save_flags);
267 stream.precision(save_prec);
268}
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
273} // End namespace Arcane
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classe gérant un répertoire.
Definition Directory.h:33
virtual String file(const String &file_name) const
Retourne le chemin complet du fichier file_name dans le répertoire.
Definition Directory.cc:138
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
void setFixed(bool fixed) override
Méthode permettant de définir le flag 'std::fixed' ou non.
void setInternal(const Ref< SimpleTableInternal > &simple_table_internal) override
Méthode permettant de définir une référence vers un SimpleTableInternal.
bool isForcedToUseScientificNotation() override
Méthode permettant de savoir si le frag 'std::scientific' est actif ou non pour l'écriture des valeur...
void clearInternal() override
Méthode permettant d'effacer le contenu de l'objet SimpleTableInternal.
void setForcedToUseScientificNotation(bool use_scientific) override
Méthode permettant de définir le flag 'std::scientific' ou non.
bool readTable(const Directory &src, const String &file_name) override
Méthode permettant de lire un fichier contenant un tableau simple.
String fileType() override
Méthode permettant de récupérer le type de fichier qui sera écrit par l'implémentation....
void print() override
Méthode permettant d'écrire le tableau dans la sortie standard.
bool isFixed() override
Méthode permettant de savoir si le frag 'std::fixed' est actif ou non pour l'écriture des valeurs.
Ref< SimpleTableInternal > internal() override
Méthode permettant de récupérer une référence vers l'objet SimpleTableInternal utilisé.
bool writeTable(const Directory &dst, const String &file_name) override
Méthode permettant d'écrire un tableau simple dans un fichier.
void setPrecision(Integer precision) override
Méthode permettant de modifier la précision du print.
Integer precision() override
Méthode permettant de récupérer la précision actuellement utilisée pour l'écriture des valeurs.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-