| 리눅스 | 스코틀랜드 사람 | 창 |
|---|---|---|
RapidCSV는 사용하기 쉬운 C ++ CSV 파서 라이브러리입니다. C ++ 11 (및 나중에)을 지원하고 헤더 전용이며 기본 테스트 스위트와 함께 제공됩니다.
도서관은 프로그래머를위한 C ++ 20 권에 실 렸습니다.
다음은 CSV 파일을 읽고 'Close'열을 플로트의 벡터로 읽는 간단한 예입니다.
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
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;
}더 많은 예를 보려면 아래의 더 많은 예제를 참조하십시오. 테스트 디렉토리에는 많은 간단한 사용 예제도 포함되어 있습니다.
RapidCSV는 휴대용이라는 의도로 C ++ 11을 사용하여 구현됩니다. 테스트되었습니다.
SRC/RAPPYCSV.H를 프로젝트/포함 디렉토리에 복사하여 포함시키기 만하면됩니다.
RapidCSV는 VCPKG 및 Conan 패키지 관리자를 통해도 제공됩니다.
다음 예제 중 일부는 examples/ 디렉토리에도 제공되며 Linux 및 MacOS에서 직접 실행할 수 있습니다. Ex001.cpp 실행 예제 :
./examples/ex001.cpp
기본적으로 RapidCSV는 첫 번째 행을 열 헤더로 취급하고 첫 번째 열은 데이터로 취급됩니다. 이를 통해 라벨을 사용하여 열이나 행이나 셀을 사용하지는 않습니다 (인덱스를 사용하면). 첫 번째 열을 행 헤드러로 처리하려면 LabelParams를 사용하고 PrownameIdx를 0으로 설정해야합니다.
colrowhdr.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
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 컨텐츠 :
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 컨텐츠 :
# 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 컨텐츠 :
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 컨텐츠 :
# 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;
}사용자 정의 분리기 (즉, 쉼표가 아님)가있는 파일을 읽으려면 분리기 파람 인수를 지정해야합니다. 다음 예제는 세미콜론을 분리기로 사용하는 파일을 읽습니다.
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 컨텐츠 :
# 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;
} 문서 클래스의 내부 셀 표현은 std :: 문자열을 사용하고 다른 유형이 요청되면 표준 변환 루틴이 사용됩니다. RapidCSV가 셀의 (첫 번째) 바이트를 캐릭터로 해석하는 char 를 제외하고 모든 표준 변환은 비교적 직선적입니다. 다음 예제는 지원되는 데이터 유형을 보여줍니다.
colrowhdr.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
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;
}Toval () 및/또는 toStr ()를 구현하여 전환 루틴 (또는 새 제품 추가)을 무시할 수 있습니다. 아래는 int 변환을 무시하는 예제입니다. 또한 toval () 및 toStr ()를 우선시하는 테스트에 대해서는 테스트/test035.cpp를 참조하십시오.
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;
}전환을 해 전화로 무시할 수도있어 유연성이 더 높아질 수도 있습니다. 이것은 다음 예에 설명되어 있습니다. 추가 변환 오버라이드 사용법은 테스트 테스트/test063.cpp에서 찾을 수 있습니다.
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 " ;
} Filename을 지정하는 것 외에도 RapidCSV는 스트림에서 문서를 구성하고 문자열에서 간접적으로 문자열을 통해 문자를 구축합니다. RapidCSV와 함께 사용되는 파일 스트림은 전체 기능을 활성화하려면 std::ios::binary 모드에서 열려야합니다. 다음은 문자열에서 CSV 데이터를 읽는 간단한 예입니다.
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;
}기본적으로 RapidCSV는 기본적으로 기본 변환 루틴의 호출 응용 프로그램에 대한 예외를 전파하기 때문에 숫자가 아닌 데이터에 액세스하려고 시도하면 예외가 발생합니다.
그 이유는 데이터 정확성을 보장하기 때문입니다. 숫자 데이터 유형으로 유효하지 않은 숫자가있는 데이터를 읽을 수 있으려면 ConverterParams를 사용하여 변환기를 숫자 값으로 기본값으로 구성 할 수 있습니다. 값은 구성 가능하며 기본적으로 플로트 유형의 경우 std :: numeric_limits :: signaling_nan (), 정수 유형의 경우 0입니다. 예:
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams( true ));RapidCsv는 getColumnNames () 및 getRownames ()를 제공하여 열 이름과 행 이름을 검색합니다. 예를 들어 특정 열 이름이 존재하는지 여부를 확인하려면 다음과 같이 할 수 있습니다.
rapidcsv::Document doc ( " file.csv " );
std::vector<std::string> columnNames = doc.GetColumnNames();
bool columnExists =
(std::find(columnNames.begin(), columnNames.end(), " A " ) != columnNames.end()); 기본적으로 RapidCSV SeparatorParams 인용 된 셀을 자동으로 삭제합니다 (즉, "example quoted cell" 에서 " pAutoQuote = false "문자를 제거합니다."
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(),
rapidcsv::SeparatorParams( ' , ' /* pSeparator */ ,
false /* pTrim */ ,
rapidcsv:: sPlatformHasCR /* pHasCR */ ,
false /* pQuotedLinebreaks */ ,
false /* pAutoQuote */ ));RapidCSV는 기본적으로 모든 라인을 읽지 만 특정 문자로 시작하는 주석 줄을 무시하도록 호출 될 수 있습니다.
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( true /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ));LinereaderParams를 사용하여 빈 줄을 건너 뛸 수도 있습니다.
rapidcsv::Document doc ( " file.csv " , rapidcsv::LabelParams(), rapidcsv::SeparatorParams(),
rapidcsv::ConverterParams(),
rapidcsv::LineReaderParams( false /* pSkipCommentLines */ ,
' # ' /* pCommentPrefix */ ,
true /* pSkipEmptyLines */ ));비 ASCII 텍스트에 대한 RapidCSV의 선호 인코딩은 UTF-8입니다. UTF-16 LE 및 UTF-16은 CodeCVT 헤더가있는 시스템에서 RapidCSV에 의해 읽고 쓸 수 있습니다. 기능을 활성화하려면 RapidCSV.H를 포함하기 전에 HAS_CODECVT를 정의하십시오. RapidCSV 단위 테스트는 CodeCVT의 존재를 자동으로 감지하고 필요에 따라 HAS_CODECVT를 설정합니다. 참조는 cmakelists.txt를 참조하십시오. 활성화되면로드 된 파일의 UTF-16 인코딩이 자동으로 감지됩니다.
RapidCSV는 FetchContent를 사용하여 CMAKE 프로젝트에 포함될 수 있습니다. Cmake FetchContent 예제 프로젝트, 특히 Cmakelists.txt를 참조하십시오.
RapidCSV는 플로트 값을 기본적으로 구문 분석 할 때 로케일 의존적 변환 기능을 사용합니다. ConverterParams 에서 mNumericLocale 설정하여 로케일 독립 구문 분석을 사용하도록 RapidCSV를 구성 할 수 있습니다. 예를 들어 tests/test087.cpp를 참조하십시오.
다음 클래스는 RapidCSV 인터페이스를 구성합니다.
RapidCSV는 테스트에 CMAKE를 사용합니다. 테스트 스위트를 구축하고 실행하는 명령 :
mkdir -p build && cd build && cmake -DRAPIDCSV_BUILD_TESTS=ON .. && make && ctest -C unit --output-on-failure && ctest -C perf --verbose ; cd -
RapidCSV는 doxygenmd를 사용하여 Markdown API 문서를 생성합니다.
doxygenmd src doc
RapidCSV는 비판을 사용하여 일관된 코드 형식을 보장합니다.
uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h
예를 들어 C ++에 대한 CSV 파서가 많이 있습니다.
RapidCSV는 BSD 3-Clause 라이센스에 따라 배포됩니다. 라이센스 파일을 참조하십시오.
GitHub 프로젝트 페이지 https://github.com/d99kris/rapidcsv에서 버그, PR 등을 환영합니다.
C ++, C ++ 11, CSV 파서, 쉼표 분리 값, 단일 헤더 라이브러리.