| Linux | Impermeable | Windows |
|---|---|---|
RapidCSV es una biblioteca de analizador CSV C ++ fácil de usar. Admite C ++ 11 (y más tarde), solo es encabezado y viene con una suite de prueba básica.
La biblioteca apareció en el libro C ++ 20 para programadores.
Aquí hay un ejemplo simple que lee un archivo CSV y obtiene la columna 'Cerrar' como un vector de flotadores.
Contenido de colhdr.csv:
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
contenido 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;
}Consulte la sección Más ejemplos a continuación para obtener más ejemplos. El directorio de pruebas también contiene muchos ejemplos de uso simples.
RapidCSV se implementa utilizando C ++ 11 con la intención de ser portátil. Se ha probado en:
Simplemente copie SRC/RapidCSV.H en su proyecto/incluido directorio e incluya.
RapidCSV también está disponible a través de los gerentes de paquetes VCPKG y Conan.
Varios de los siguientes ejemplos también se proporcionan en los examples/ directorio y se pueden ejecutar directamente en Linux y MacOS. Ejemplo ejecutando ex001.cpp:
./examples/ex001.cpp
Por defecto, RapidCSV trata la primera fila como encabezados de columna, y la primera columna se trata como datos. Esto permite acceder a columnas usando sus etiquetas, pero no filas o celdas (solo usando índices). Para tratar la primera columna como encabezados de fila, uno debe usar LabelParams y establecer PROWEIDX en 0.
COLROWHDR.CSV Contenido:
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
ex002.cpp contenido:
# 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 Contenido:
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
ex003.cpp contenido:
# 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;
}nohdr.csv contenido:
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
ex004.cpp contenido:
# 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;
}Para leer archivos con separador personalizado (es decir, no coma), uno debe especificar el argumento separatorParams. El siguiente ejemplo lee un archivo usando semi-colon como separador.
Contenido 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
ex005.CPP Contenido:
# 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 representación de celda interna en la clase de documento está utilizando std :: string y cuando se solicitan otros tipos, se utilizan rutinas de conversión estándar. Todas las conversiones estándar son relativamente directas, con la excepción de char para la cual RapidCSV interpreta el (primero) byte de la célula como carácter. El siguiente ejemplo ilustra los tipos de datos compatibles.
COLROWHDR.CSV Contenido:
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
contenido 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;
}Uno puede anular las rutinas de conversión (o agregar nuevas) implementando toVal () y/o toStr (). A continuación se muestra un ejemplo de conversión INT de INT, para proporcionar dos números de punto fijo decimales. Vea también las pruebas/test035.cpp para una prueba anular toval () y toStr ().
contenido 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;
}También es posible anular las conversiones de manera previa, lo que permite más flexibilidad. Esto se ilustra en el siguiente ejemplo. El uso adicional de anulación de conversión se puede encontrar en las pruebas de prueba/test063.cpp
contenido 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 " ;
} Además de especificar un nombre de archivo, RapidCSV admite la construcción de un documento a partir de una transmisión e, indirectamente a través de Stringstream, desde una cadena. Las transmisiones de archivos utilizadas con RAPTCSV deben abrirse en el modo std::ios::binary para habilitar la funcionalidad completa. Aquí hay un ejemplo simple que lee datos CSV de una cadena:
contenido 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;
}Por defecto, RapidCSV lanza una excepción si se intenta acceder a datos no numéricos como un tipo de datos numéricos, ya que básicamente propaga las excepciones de las rutinas de conversión subyacentes a la aplicación de llamada.
La razón de esto es garantizar la corrección de los datos. Si uno quiere poder leer datos con números no válidos como tipos de datos numéricos, se puede usar ConverterParams para configurar el convertidor para predeterminar un valor numérico. El valor es configurable y, por defecto, es std :: numeric_limits :: señaling_nan () para tipos de flotación, y 0 para tipos enteros. Ejemplo:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams( true ));RapidCSV proporciona los métodos getColumnnames () y getRownames () para recuperar los nombres de columna y fila. Para verificar si existe un nombre de columna en particular, uno puede, por ejemplo, hacer:
rapidcsv::Document doc ( " file.csv " );
std::vector<std::string> columnNames = doc.GetColumnNames();
bool columnExists =
(std::find(columnNames.begin(), columnNames.end(), " A " ) != columnNames.end()); Por defecto, RapidCSV se desbrota automáticamente las celdas citadas (es decir, elimina los " caracteres encapsulantes de "example quoted cell" ). Esta funcionalidad puede desactivarse pasando pAutoQuote = false en SeparatorParams , ejemplo::
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams( ' , ' /* pSeparator */ ,
false /* pTrim */ ,
rapidcsv:: sPlatformHasCR /* pHasCR */ ,
false /* pQuotedLinebreaks */ ,
false /* pAutoQuote */ ));RapidCSV lee todas las líneas por defecto, pero puede llamarse a ignorar las líneas de comentarios que comienzan con un carácter específico, ejemplo:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( true /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ));Usando LinereaderParams también es posible omitir líneas vacías, ejemplo:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( false /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ,
true /* pSkipEmptyLines */ ));La codificación preferida de RapidCSV para el texto no ASCII es UTF-8. UTF-16 LE y UTF-16 BE pueden ser leídos y escritos por RapidCSV en sistemas donde el encabezado CODECVT está presente. Defina HAS_CODECVT antes de incluir RapidCSV.H para habilitar la funcionalidad. Las pruebas de la unidad RapidCSV detectan automáticamente la presencia de CODECVT y establece HAS_CODECVT según sea necesario, consulte cmakelists.txt como referencia. Cuando está habilitado, la codificación UTF-16 de cualquier archivo cargado se detecta automáticamente.
RapidCSV puede incluirse en un proyecto CMake utilizando FetchContent. Consulte el proyecto de ejemplo de CMake FetchContent y, en particular, su CMakelists.txt.
RapidCSV utiliza funciones de conversión dependientes de locales al analizar los valores de flotación de forma predeterminada. Es posible configurar RapidCSV para utilizar el análisis independiente local al configurar mNumericLocale en ConverterParams , consulte, por ejemplo, Tests/Test087.CPP
Las siguientes clases constituyen la interfaz RapidCSV:
RapidCSV utiliza CMake para sus pruebas. Comandos para construir y ejecutar la suite de prueba:
mkdir -p build && cd build && cmake -DRAPIDCSV_BUILD_TESTS=ON .. && make && ctest -C unit --output-on-failure && ctest -C perf --verbose ; cd -
RapidCSV usa DoxyGenMD para generar su documentación de API de Markdown:
doxygenmd src doc
RapidCSV utiliza Unrustify para garantizar un formato de código constante:
uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h
Hay muchos analizadores de CSV para C ++, por ejemplo:
RapidCSV se distribuye bajo la licencia de cláusula BSD 3. Ver archivo de licencia.
Bugs, PRS, etc. son bienvenidos en la página del proyecto GitHub https://github.com/d99kris/rapidcsv
C ++, C ++ 11, analizador CSV, valores separados por comas, biblioteca de encabezado único.