| Linux | ماك | النوافذ |
|---|---|---|
RapidCSV هي مكتبة C ++ CSV سهلة الاستخدام. إنه يدعم C ++ 11 (وبعد ذلك) ، هو الرأس فقط ويأتي مع مجموعة اختبار أساسية.
ظهرت المكتبة في كتاب C ++ 20 للمبرمجين.
فيما يلي مثال بسيط على قراءة ملف CSV والحصول على عمود "إغلاق" كمتجه من العوامات.
محتوى 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/RAPIDCSV.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 :: String وعندما يتم طلب أنواع أخرى ، يتم استخدام إجراءات التحويل القياسية. جميع التحويلات القياسية مستقيمة نسبيًا ، باستثناء char الذي يفسر RapidCSV بايت الخلية (الأول) كحرف. يوضح المثال التالي أنواع البيانات المدعومة.
محتوى 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 (). فيما يلي مثال على التحويل الباحث ، لتوفير رقمين من النقطة الثابتة العشرية. انظر أيضًا الاختبارات/test035.cpp لاختبار التجاوز toval () و tostr ().
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 " ;
} بالإضافة إلى تحديد اسم ملف ، يدعم RapidCSV بناء مستند من دفق ، وبشكل غير مباشر من خلال StringStream ، من سلسلة. يجب فتح تدفقات الملفات المستخدمة مع 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()); بشكل افتراضي pAutoQuote = false تقوم RapidCSV بتزويد الخلايا المقتبسة تلقائيًا (أي إزالة " الأحرف من" مثال SeparatorParams "example quoted cell" .
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 */ ));الترميز المفضل لدى RapidCSV للنص غير ASCII هو UTF-8. يمكن قراءة UTF-16 LE و UTF-16 وكتابتها بواسطة RAPIDCSV على الأنظمة التي يوجد فيها رأس CODECVT. حدد HAS_CODECVT قبل تضمين RAPIDCSV.H من أجل تمكين الوظيفة. تقوم اختبارات وحدة RapidCSV تلقائيًا باكتشاف وجود CODECVT ومجموعات HAS_CODECVT حسب الحاجة ، انظر cmakelists.txt للرجوع إليها. عند التمكين ، يتم اكتشاف ترميز UTF-16 لأي ملف محمّل تلقائيًا.
قد يتم تضمين RAPIDCSV في مشروع CMAKE باستخدام FetchContent. ارجع إلى مشروع مثال Cmake FetchContent وخاصة cmakelists.txt.
يستخدم RapidCSV وظائف التحويل المعتمدة على اللغة عند تحليل القيم العائمة بشكل افتراضي. من الممكن تكوين RAPIDCSV لاستخدام التحليل المستقل المستقل عن طريق تعيين mNumericLocale في ConverterParams ، انظر على سبيل المثال الاختبارات/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 لإنشاء وثائق API الخاصة بها:
doxygenmd src doc
يستخدم RapidCSV غير موثوق لضمان تنسيق رمز ثابت:
uncrustify -c uncrustify.cfg --no-backup src/rapidcsv.h
هناك العديد من محلات CSV لـ C ++ ، على سبيل المثال:
يتم توزيع RAPIDCSV بموجب ترخيص BSD المكون من 3 نقاط. انظر ملف الترخيص.
البقاء ، PRS ، إلخ.
C ++ ، C ++ 11 ، CSV Parser ، قيم مفصول فاصلة ، مكتبة رأس واحدة.