diff --git a/inc/hgl/util/csv/CSVFieldSplite.h b/inc/hgl/util/csv/CSVFieldSplite.h new file mode 100644 index 0000000..ee5a06f --- /dev/null +++ b/inc/hgl/util/csv/CSVFieldSplite.h @@ -0,0 +1,26 @@ +#pragma once + +namespace hgl +{ + namespace util + { + /** + * CSV字段拆分工具
+ * 支持逗号分隔与tab分隔以及使用引号包裹的字符串 */ + class CSVFieldSplite + { + const char *str; + int str_length; + + const char *sp; + const char *end; + + public: + + CSVFieldSplite(const char *s,const int length); + ~CSVFieldSplite()=default; + + const char *next_field(int *len); + };//class CSVFieldSplite + }//namespace util +}//namespace hgl diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3e65073..36aec87 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -63,6 +63,11 @@ ENDIF(CM_UTIL_SUPPORT_HASH) #################################################################################################### +SET(CSV_SOURCE ${CMUTIL_ROOT_INCLUDE_PATH}/hgl/util/csv/CSVFieldSplite.h + csv/CSVFieldSplite.cpp) + +SOURCE_GROUP("CSV" FILES ${CSV_SOURCE}) + SET(CMD_SOURCE ${CMUTIL_ROOT_INCLUDE_PATH}/hgl/util/cmd/CmdParse.h cmd/CmdParse.cpp) @@ -90,6 +95,7 @@ add_cm_library(CMUtil "CM" ${CMD_SOURCE} ${XML_PARSE_SOURCE} ${JSON_TOOL_SOURCE} + ${CSV_SOURCE} ${HASH_HEADER_FILES} ${HASH_SOURCE_FILES} diff --git a/src/csv/CSVFieldSplite.cpp b/src/csv/CSVFieldSplite.cpp new file mode 100644 index 0000000..a6e82de --- /dev/null +++ b/src/csv/CSVFieldSplite.cpp @@ -0,0 +1,61 @@ +#include +#include + +namespace hgl +{ + namespace util + { + CSVFieldSplite::CSVFieldSplite(const char *s,const int length) + { + str=s; + str_length=length; + sp=str; + end=str+str_length; + } + + const char *CSVFieldSplite::next_field(int *len) + { + if(!len)return(nullptr); + if(sp>=end)return(nullptr); + + if(*sp==','||*sp=='\t') + { + *len=0; + ++sp; + return sp; + } + + const char *result; + + if(*sp=='"') + { + ++sp; + + const char *ep=hgl::strchr(sp,'"'); + + if(!ep) + return nullptr; + + result=sp; + + *len=ep-sp; + sp=ep+2; + return result; + } + else + { + result=sp; + + const char *ep=sp+1; + + while(*ep!=','&&*ep!='\t'&&ep