#pragma once #include #include namespace hgl { namespace util { /** * CSV输出控制 */ template class CSVOutput { io::TextOutputStream *tos; uint FieldCount; T FieldsTerminatedChar; T EnclosedChar; T NullStringField[2]; protected: uint write_count; void NextField() { --write_count; if(!write_count) { write_count=FieldCount; tos->WriteLineEnd(); } else tos->WriteChars(&FieldsTerminatedChar,1); } public: CSVOutput( io::TextOutputStream *os, //文本输出流 const uint field_count, //字段数量 const T fields_terminated_char=T(','), //字段分隔符 const T enclosed_char=T('"')) //字符串包裹字符 { tos=os; FieldCount =field_count; FieldsTerminatedChar=fields_terminated_char; EnclosedChar =enclosed_char; NullStringField[0] =enclosed_char; NullStringField[1] =enclosed_char; write_count =FieldCount; } ~CSVOutput()=default; void WriteString(const T *str,const int len) { if(!str||!*str||len<=0) { tos->WriteChars(NullStringField,2); } else { tos->WriteChars(&EnclosedChar,1); tos->WriteChars(str,len); tos->WriteChars(&EnclosedChar,1); } NextField(); } void WriteString(const String &str) { WriteString(str.c_str(),str.Length()); } void WriteStringList(const StringList &sl) { for(const String &str:sl) WriteString(str); } void WriteStringList(const std::initializer_list> &sl) { for(const String &str:sl) WriteString(str); } void WriteStringList(const std::initializer_list &sl) { for(const T *str:sl) WriteString(str); } template void WriteInteger(const I &value) { tos->WriteString(String::numberOf(value)); NextField(); } template void WriteFloat(const F &value,const uint frac) { tos->WriteString(String::floatOf(value,frac)); NextField(); } };//class CSVOutput using UTF8CSVOutput=CSVOutput; using UTF16CSVOutput=CSVOutput; using UTF32CSVOutput=CSVOutput; inline CSVOutput * CreateUTF8CSVOutput (io::TextOutputStream * tos,const uint fc,const u8char ftc=U8_TEXT (','),const u8char ec=U8_TEXT ('"')){return(new UTF8CSVOutput (tos,fc,ftc,ec));} inline CSVOutput * CreateUTF16CSVOutput (io::TextOutputStream * tos,const uint fc,const u16char ftc=U16_TEXT(','),const u16char ec=U16_TEXT('"')){return(new UTF16CSVOutput(tos,fc,ftc,ec));} inline CSVOutput * CreateUTF32CSVOutput (io::TextOutputStream * tos,const uint fc,const u32char ftc=U32_TEXT(','),const u32char ec=U32_TEXT('"')){return(new UTF16CSVOutput(tos,fc,ftc,ec));} }//namespace util }//namespace hgl