#include <string>
#include <list>
typedef std::list<std::string> CSVRecord;
size_t ReadFieldValue(const std::string& str, size_t pos, const char* pszSeparator, std::string& strFieldValue)
{
// 清空字段值
strFieldValue = "";
// 分隔字符序列为空
if ( NULL == pszSeparator )
{
// 返回无效字符索引
return std::string::npos;
}
// 待查找字符串为空
if ( str.empty() )
{
return std::string::npos;
}
// 跳过无效字符
while ( (' ' == str[pos]) || ('\t' == str[pos]) )
{
++pos;
}
// 查找字符超出字符串边界
if ( '\0' == str[pos] )
{
return std::string::npos;
}
size_t found = str.find_first_of(pszSeparator, pos);
if ( pos == found )
{
return found;
}
else if ( std::string::npos != found )
{
// 效率比substr要快很多
strFieldValue.assign((str.begin() + pos), (str.begin() + found));
return found;
}
else
{
strFieldValue.assign((str.begin() + pos), str.end());
return std::string::npos;
}
}
bool ParseCSVLine(const std::string str, const char* pszSeparator, CSVRecord& oRecord)
{
oRecord.clear();
if ( str.empty() || !pszSeparator)
{
return false;
}
std::string strFieldValue;
size_t found = ReadFieldValue(str, 0, pszSeparator, strFieldValue);
while ( std::string::npos != found )
{
oRecord.push_back(strFieldValue);
found = ReadFieldValue(str, found + 1, pszSeparator, strFieldValue);
}
return true;
}
int main(int argc, char* argv[])
{
std::string strTest = "abc'1111,gef,dhk,,1111";
CSVRecord oRecord;
ParseCSVLine(strTest, ",'", oRecord);
return 0;
}