| Linux | Mac | Fenêtre |
|---|---|---|
RapidCSV est une bibliothèque d'analyse CSV C ++ facile à utiliser. Il prend en charge C ++ 11 (et plus tard), est uniquement en tête et est livré avec une suite de test de base.
La bibliothèque a été présentée dans le livre C ++ 20 pour les programmeurs.
Voici un exemple simple de lecture d'un fichier CSV et d'obtenir une colonne «clôturer» en tant que vecteur de flotteurs.
Colhdr.csv Contenu:
Open,High,Low,Close,Volume,Adj Close
64.529999,64.800003,64.139999,64.620003,21705200,64.620003
64.419998,64.730003,64.190002,64.620003,20235200,64.620003
64.330002,64.389999,64.050003,64.360001,19259700,64.360001
64.610001,64.949997,64.449997,64.489998,19384900,64.489998
64.470001,64.690002,64.300003,64.620003,21234600,64.620003
contenu ex001.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/colhdr.csv " );
std::vector< float > col = doc. GetColumn < float >( " Close " );
std::cout << " Read " << col. size () << " values. " << std::endl;
}Reportez-vous à la section plus d'exemples ci-dessous pour plus d'exemples. Le répertoire des tests contient également de nombreux exemples d'utilisation simples.
RapidCSV est implémenté en utilisant C ++ 11 avec l'intention d'être portable. Il a été testé sur:
Copiez simplement SRC / RapidCSV.H à votre projet / incluez le répertoire et incluez-le.
RapidCSV est également disponible via les gestionnaires de packages VCPKG et Conan.
Plusieurs des exemples suivants sont également fournis dans les examples/ répertoires et peuvent être exécutés directement sous Linux et MacOS. Exemple exécutant ex001.cpp:
./examples/ex001.cpp
Par défaut, RapidCSV traite la première ligne comme des en-têtes de colonne, et la première colonne est traitée comme des données. Cela permet d'accès à des colonnes en utilisant leurs étiquettes, mais pas des lignes ou des cellules (uniquement à l'aide d'indices). Afin de traiter la première colonne comme des en-têtes de ligne, il faut utiliser des laboratoires et définir PrownameIDX sur 0.
Colrowhdr.csv Contenu:
Date,Open,High,Low,Close,Volume,Adj Close
2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003
2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003
2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001
2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998
2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003
Contenu ex002.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/colrowhdr.csv " , rapidcsv::LabelParams ( 0 , 0 ));
std::vector< float > close = doc. GetRow < float >( " 2017-02-22 " );
std::cout << " Read " << close . size () << " values. " << std::endl;
long long volume = doc. GetCell < long long >( " Volume " , " 2017-02-22 " );
std::cout << " Volume " << volume << " on 2017-02-22. " << std::endl;
}Rowhdr.csv Contenu:
2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003
2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003
2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001
2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998
2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003
Contenu ex003.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/rowhdr.csv " , rapidcsv::LabelParams (- 1 , 0 ));
std::vector<std::string> row = doc. GetRow <std::string>( " 2017-02-22 " );
std::cout << " Read " << row. size () << " values. " << std::endl;
}Contenu nohdr.csv:
64.529999,64.800003,64.139999,64.620003,21705200,64.620003
64.419998,64.730003,64.190002,64.620003,20235200,64.620003
64.330002,64.389999,64.050003,64.360001,19259700,64.360001
64.610001,64.949997,64.449997,64.489998,19384900,64.489998
64.470001,64.690002,64.300003,64.620003,21234600,64.620003
Contenu ex004.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/nohdr.csv " , rapidcsv::LabelParams (- 1 , - 1 ));
std::vector< float > close = doc. GetColumn < float >( 5 );
std::cout << " Read " << close . size () << " values. " << std::endl;
long long volume = doc. GetCell < long long >( 4 , 2 );
std::cout << " Volume " << volume << " on 2017-02-22. " << std::endl;
}Pour la lecture de fichiers avec un séparateur personnalisé (c'est-à-dire pas une virgule), il faut spécifier l'argument SéparateurParams. L'exemple suivant lit un fichier utilisant le semi-colon comme séparateur.
Contenu semi.csv:
Date;Open;High;Low;Close;Volume;Adj Close
2017-02-24;64.529999;64.800003;64.139999;64.620003;21705200;64.620003
2017-02-23;64.419998;64.730003;64.190002;64.620003;20235200;64.620003
2017-02-22;64.330002;64.389999;64.050003;64.360001;19259700;64.360001
2017-02-21;64.610001;64.949997;64.449997;64.489998;19384900;64.489998
2017-02-17;64.470001;64.690002;64.300003;64.620003;21234600;64.620003
Contenu ex005.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/semi.csv " , rapidcsv::LabelParams ( 0 , 0 ),
rapidcsv::SeparatorParams ( ' ; ' ));
std::vector< float > close = doc. GetColumn < float >( " Close " );
std::cout << " Read " << close . size () << " values. " << std::endl;
long long volume = doc. GetCell < long long >( " Volume " , " 2017-02-22 " );
std::cout << " Volume " << volume << " on 2017-02-22. " << std::endl;
} La représentation des cellules internes dans la classe de documents utilise Std :: String et lorsque d'autres types sont demandés, des routines de conversion standard sont utilisées. Toutes les conversions standard sont relativement simples, à l'exception de char pour lequel RapidCSV interprète le (premier) octet de la cellule en tant que personnage. L'exemple suivant illustre les types de données pris en charge.
Colrowhdr.csv Contenu:
Date,Open,High,Low,Close,Volume,Adj Close
2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003
2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003
2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001
2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998
2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003
contenu ex006.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
rapidcsv::Document doc ( " examples/colrowhdr.csv " , rapidcsv::LabelParams ( 0 , 0 ));
std::cout << doc. GetCell <std::string>( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < int >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < long >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < long long >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < unsigned >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < unsigned long >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < unsigned long long >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < float >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < double >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < long double >( " Volume " , " 2017-02-22 " ) << std::endl;
std::cout << doc. GetCell < char >( " Volume " , " 2017-02-22 " ) << std::endl;
}On peut remplacer les routines de conversion (ou en ajouter de nouvelles) en implémentant Toval () et / ou ToStr (). Vous trouverez ci-dessous un exemple de conversion d'introduction en cours, pour fournir à la place deux nombres à virgule fixe décimaux. Voir également Tests / test035.cpp pour un test priant Toval () et ToStr ().
Contenu ex008.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
namespace rapidcsv
{
template <>
void Converter< int >::ToVal( const std::string& pStr, int & pVal) const
{
pVal = static_cast < int >( roundf ( 100 . 0f * std::stof (pStr)));
}
}
int main ()
{
rapidcsv::Document doc ( " examples/colrowhdr.csv " , rapidcsv::LabelParams ( 0 , 0 ));
std::vector< int > close = doc. GetColumn < int >( " Close " );
std::cout << " close[0] = " << close [ 0 ] << std::endl;
std::cout << " close[1] = " << close [ 1 ] << std::endl;
}Il est également possible de remplacer les conversions par appel, permettant plus de flexibilité. Ceci est illustré dans l'exemple suivant. Une utilisation supplémentaire de substitution de conversion peut être trouvée dans les tests de test / test063.cpp
Contenu ex009.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
void ConvFixPoint ( const std::string& pStr, int & pVal)
{
pVal = static_cast < int >( roundf ( 100 . 0f * std::stof (pStr)));
}
struct MyStruct
{
int val = 0 ;
};
void ConvMyStruct ( const std::string& pStr, MyStruct& pVal)
{
pVal. val = static_cast < int >( roundf ( 100 . 0f * std::stof (pStr)));
}
int main ()
{
rapidcsv::Document doc ( " examples/colrowhdr.csv " , rapidcsv::LabelParams ( 0 , 0 ));
std::cout << " regular = " << doc. GetCell < int >( " Close " , " 2017-02-21 " ) << " n " ;
std::cout << " fixpointfunc = " << doc. GetCell < int >( " Close " , " 2017-02-21 " , ConvFixPoint) << " n " ;
auto convFixLambda = []( const std::string& pStr, int & pVal) { pVal = static_cast < int >( roundf ( 100 . 0f * stof (pStr))); };
std::cout << " fixpointlambda = " << doc. GetCell < int >( " Close " , " 2017-02-21 " , convFixLambda) << " n " ;
std::cout << " mystruct = " << doc. GetCell <MyStruct>( " Close " , " 2017-02-21 " , ConvMyStruct). val << " n " ;
} En plus de spécifier un nom de fichier, RapidCSV prend en charge la construction d'un document à partir d'un flux et, indirectement via Stringstream, à partir d'une chaîne. Les flux de fichiers utilisés avec RapidCSV doivent être ouverts dans std::ios::binary pour permettre une fonctionnalité complète. Voici un exemple simple lisant les données CSV d'une chaîne:
Contenu ex007.cpp:
# include < iostream >
# include < vector >
# include " rapidcsv.h "
int main ()
{
const std::string& csv =
" Date,Open,High,Low,Close,Volume,Adj Close n "
" 2017-02-24,64.529999,64.800003,64.139999,64.620003,21705200,64.620003 n "
" 2017-02-23,64.419998,64.730003,64.190002,64.620003,20235200,64.620003 n "
" 2017-02-22,64.330002,64.389999,64.050003,64.360001,19259700,64.360001 n "
" 2017-02-21,64.610001,64.949997,64.449997,64.489998,19384900,64.489998 n "
" 2017-02-17,64.470001,64.690002,64.300003,64.620003,21234600,64.620003 n "
;
std::stringstream sstream (csv);
rapidcsv::Document doc (sstream, rapidcsv::LabelParams ( 0 , 0 ));
std::vector< float > close = doc. GetColumn < float >( " Close " );
std::cout << " Read " << close . size () << " values. " << std::endl;
long long volume = doc. GetCell < long long >( " Volume " , " 2017-02-22 " );
std::cout << " Volume " << volume << " on 2017-02-22. " << std::endl;
}Par défaut, RapidCSV lance une exception si l'on essaie d'accéder aux données non numériques en tant que type de données numériques, car il propage essentiellement les exceptions des routines de conversion sous-jacentes à l'application d'appel.
La raison en est d'assurer l'exactitude des données. Si l'on veut pouvoir lire des données avec des nombres non valides comme types de données numériques, on peut utiliser ConverterParams pour configurer le convertisseur en valeur par défaut en valeur numérique. La valeur est configurable et par défaut, c'est std :: Numeric_limits :: Signaling_nan () pour les types de flotteurs, et 0 pour les types entiers. Exemple:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams( true ));RapidCsv fournit les méthodes getColumnNames () et getRownames () pour récupérer les noms de colonne et de lignes. Pour vérifier si un nom de colonne particulier existe, on peut par exemple faire:
rapidcsv::Document doc ( " file.csv " );
std::vector<std::string> columnNames = doc.GetColumnNames();
bool columnExists =
(std::find(columnNames.begin(), columnNames.end(), " A " ) != columnNames.end()); Par défaut, RapidCSV déquote automatiquement les cellules citées (c'est-à-dire supprime les " caractères de "example quoted cell" ). Cette fonctionnalité peut être désactivée en passant pAutoQuote = false dans SeparatorParams , exemple:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams( ' , ' /* pSeparator */ ,
false /* pTrim */ ,
rapidcsv:: sPlatformHasCR /* pHasCR */ ,
false /* pQuotedLinebreaks */ ,
false /* pAutoQuote */ ));RapidCSV lit toutes les lignes par défaut, mais peut être appelée pour ignorer les lignes de commentaires en commençant par un caractère spécifique, exemple:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( true /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ));À l'aide de lineReaderParams, il est également possible de sauter des lignes vides, exemple:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( false /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ,
true /* pSkipEmptyLines */ ));Le codage préféré de RapidCSV pour le texte non ASCII est UTF-8. UTF-16 LE et UTF-16 peuvent être lus et écrits par RapidCSV sur les systèmes où l'en-tête CodeCVT est présent. Définissez HAS_CODECVT avant d'inclure RapidCSV.H afin d'activer la fonctionnalité. RapidCSV Unit Tests détecte automatiquement la présence de CodeCVT et définit HAS_CODECVT au besoin, voir cMakelists.txt pour référence. Lorsqu'il est activé, le codage UTF-16 de tout fichier chargé est automatiquement détecté.
RapidCSV peut être inclus dans un projet CMake en utilisant FetchContent. Reportez-vous au projet CMake FetchContent Exemple et en particulier son CMakelists.txt.
RapidCSV utilise des fonctions de conversion dépendantes des paramètres régionaux lors de l'analyse des valeurs flottantes par défaut. Il est possible de configurer RapidCSV pour utiliser l'analyse indépendante des paramètres régionaux en définissant mNumericLocale dans ConverterParams , voir par exemple les tests / test087.cpp
Les classes suivantes constituent l'interface RapidCSV:
RapidCSV utilise Cmake pour ses tests. Commandes pour construire et exécuter la suite de tests:
mkdir -p build && cd build && cmake -DRAPIDCSV_BUILD_TESTS=ON .. && make && ctest -C unit --output-on-failure && ctest -C perf --verbose ; cd -
RapidCSV utilise le doxygenMD pour générer sa documentation de l'API Markdown:
doxygenmd src doc
RapidCSV utilise un non-crustifie pour assurer la mise en forme cohérente du code:
uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h
Il existe de nombreux analyseurs CSV pour C ++, par exemple:
RapidCSV est distribué dans le cadre de la licence BSD 3-CLAUSE. Voir le fichier de licence.
Les bogues, les PRS, etc. sont les bienvenus sur la page du projet GitHub https://github.com/d99kris/rapidcsv
C ++, C ++ 11, analyseur CSV, valeurs séparées par des virgules, bibliothèque d'en-tête unique.