Arcane  4.2.3.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-2026 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-2026 */
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 "arccore/base/Directory.h"
17#include "arcane/utils/Iostream.h"
18
19#include <limits>
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
31writeTable(const Directory& dst, const String& file_name)
32{
33 std::ofstream ofile((dst.file(file_name) + "." + fileType()).localstr());
34 if (ofile.fail())
35 return false;
36
37 _print(ofile);
38
39 ofile.close();
40 return true;
41}
42
44readTable(const Directory& src, const String& file_name)
45{
47
48 std::ifstream stream;
49
50 // S'il n'y a pas de fichier, on retourne false.
51 if (!_openFile(stream, src, file_name + "." + fileType())) {
52 return false;
53 }
54
55 std::string line;
56
57 // S'il n'y a pas de première ligne, on arrête là.
58 // Un fichier écrit par SimpleCsvOutput possède toujours au
59 // moins une ligne.
60 if (!std::getline(stream, line)) {
61 _closeFile(stream);
62 return false;
63 }
64
65 // Sinon, on a la ligne d'entête, contenant les noms
66 // des colonnes (et le nom du tableau).
67 String ligne(line);
68
69 {
71 ligne.split(tmp, m_separator);
72
73 if (tmp.size() == 0) {
74 _closeFile(stream);
75 return false;
76 }
77
78 m_simple_table_internal->m_table_name = tmp[0];
79 m_simple_table_internal->m_column_names = tmp.subConstView(1, tmp.size());
80 }
81
82 // S'il n'y a pas d'autres lignes, c'est qu'il n'y a que des
83 // colonnes vides (ou aucunes colonnes) et aucunes lignes.
84 if (!std::getline(stream, line)) {
85 _closeFile(stream);
86 return true;
87 }
88
89 // Maintenant que l'on a le nombre de colonnes, on peut définir
90 // la dimension 2 du tableau de valeurs.
91 m_simple_table_internal->m_values.resize(1, m_simple_table_internal->m_column_names.size());
92
93 Integer compt_line = 0;
94
95 do {
96 // On n'a pas le nombre de lignes en avance,
97 // donc on doit resize à chaque tour.
98 m_simple_table_internal->m_values.resize(compt_line + 1);
99
100 // On split la ligne récupérée.
101 StringUniqueArray splitted_line;
102 String ligne(line);
103 ligne.split(splitted_line, m_separator);
104
105 // S'il y a une ligne vide, on l'a passe.
106 if (splitted_line.size() == 0) {
107 continue;
108 }
109
110 // Si le nombre de colonnes de la ligne ne correspond pas au nombre
111 // de nom de colonnes, il y a une erreur dans le fichier.
112 if (splitted_line.size() != m_simple_table_internal->m_column_names.size() + 1) {
113 _closeFile(stream);
114 return false;
115 }
116
117 // Le premier élement est le nom de ligne.
118 m_simple_table_internal->m_row_names.add(splitted_line[0]);
119
120 // Les autres élements sont des Reals.
121 for (Integer i = 1; i < splitted_line.size(); i++) {
122 std::string std_string = splitted_line[i].localstr();
123 std::size_t pos_comma = std_string.find(',');
124
125 if (pos_comma != std::string::npos) {
126 std_string[pos_comma] = '.';
127 }
128
129 m_simple_table_internal->m_values[compt_line][i - 1] = std::stod(std_string);
130 }
131
132 compt_line++;
133 } while (std::getline(stream, line));
134
135 _closeFile(stream);
136
137 // On n'a pas sauvegardé les tailles des lignes/colonnes donc on met la taille max
138 // pour chaque ligne/colonne.
139 m_simple_table_internal->m_row_sizes.resize(m_simple_table_internal->m_row_names.size());
140 m_simple_table_internal->m_row_sizes.fill(m_simple_table_internal->m_values.dim2Size());
141
142 m_simple_table_internal->m_column_sizes.resize(m_simple_table_internal->m_column_names.size());
143 m_simple_table_internal->m_column_sizes.fill(m_simple_table_internal->m_values.dim1Size());
144
145 return true;
146}
147
150{
151 m_simple_table_internal->clear();
152}
153
155print()
156{
157 _print(std::cout);
158}
159
160/*---------------------------------------------------------------------------*/
161/*---------------------------------------------------------------------------*/
162
164precision()
165{
166 return m_precision_print;
167}
168
171{
172 if (precision < 1)
173 m_precision_print = 1;
174 else if (precision > (std::numeric_limits<Real>::max_digits10))
175 m_precision_print = (std::numeric_limits<Real>::max_digits10);
176 else
177 m_precision_print = precision;
178}
179
181isFixed()
182{
183 return m_is_fixed_print;
184}
185
187setFixed(bool fixed)
188{
189 m_is_fixed_print = fixed;
190}
191
194{
195 return m_scientific_notation;
196}
197
199setForcedToUseScientificNotation(bool use_scientific)
200{
201 m_scientific_notation = use_scientific;
202}
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
208internal()
209{
210 return m_simple_table_internal;
211}
212
214setInternal(const Ref<SimpleTableInternal>& simple_table_internal)
215{
216 if (simple_table_internal.isNull())
217 ARCANE_FATAL("La réference passée en paramètre est Null.");
218 m_simple_table_internal = simple_table_internal;
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224bool SimpleCsvReaderWriter::
225_openFile(std::ifstream& stream, Directory directory, const String& file)
226{
227 stream.open(directory.file(file).localstr(), std::ifstream::in);
228 return stream.good();
229}
230
231void SimpleCsvReaderWriter::
232_closeFile(std::ifstream& stream)
233{
234 stream.close();
235}
236
237void SimpleCsvReaderWriter::
238_print(std::ostream& stream)
239{
240 // On enregistre les infos du stream pour les restaurer à la fin.
241 std::ios_base::fmtflags save_flags = stream.flags();
242 std::streamsize save_prec = stream.precision();
243
244 if (m_is_fixed_print) {
245 stream << std::setiosflags(std::ios::fixed);
246 }
247 if (m_scientific_notation) {
248 stream << std::scientific;
249 }
250 stream << std::setprecision(m_precision_print);
251
252 stream << m_simple_table_internal->m_table_name << m_separator;
253
254 for (Integer j = 0; j < m_simple_table_internal->m_column_names.size(); j++) {
255 stream << m_simple_table_internal->m_column_names[j] << m_separator;
256 }
257 stream << std::endl;
258
259 for (Integer i = 0; i < m_simple_table_internal->m_values.dim1Size(); i++) {
260 stream << m_simple_table_internal->m_row_names[i] << m_separator;
261 ConstArrayView<Real> view = m_simple_table_internal->m_values[i];
262 for (Integer j = 0; j < m_simple_table_internal->m_values.dim2Size(); j++) {
263 stream << view[j] << m_separator;
264 }
265 stream << std::endl;
266 }
267
268 stream.flags(save_flags);
269 stream.precision(save_prec);
270}
271
272/*---------------------------------------------------------------------------*/
273/*---------------------------------------------------------------------------*/
274
275} // End namespace Arcane
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
Arcane::UniqueArray< Arcane::UniqueArray< DataType > > m_values
Conteneur des variables génériques.
ConstArrayView< T > subConstView(Int64 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Classe gérant un répertoire.
String file(const String &file_name) const override
Retourne le chemin complet du fichier file_name dans le répertoire.
Definition Directory.cc:120
bool isNull() const
Indique si le compteur référence une instance non nulle.
Référence à une instance.
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.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:228
void split(StringContainer &str_array, char c) const
Découpe la chaîne suivant le caractère c.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type représentant un entier.
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
Definition UtilsTypes.h:357