Purpose: Splits a line from a .csv file into it's fields. Copes with quoted values automatically, removes double-quote pairs if present and de-escapes sequences.
| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | SplitCSV | (hzArray<hzString>&,const char*,char,) |
Declared in file: hzTextproc.h
Defined in file : hzTextproc.cpp
Function Logic:
Function body:
hzEcode SplitCSV (hzArray<hzString>& ar)const char* line, char cDelim,
{
// Category: Text Processing
//
// Purpose: Splits a line from a .csv file into it's fields. Copes with quoted values automatically, removes double-quote pairs
// if present and de-escapes sequences.
//
// Arguments: 1) ar Either an array of char* or an array of hzString
// 2) line The line to be split (char*)
// 3) cDelim Delimitor char
//
// Returns: E_ARGUMENT If either the target array or the line is empty
// E_FORMAT If the number of fields does not match expected number
// E_OK If successful
hzChain C ; // Working chain
const char* i ; // Input iterator
hzString S ; // Data field
ar.Clear() ;
i = line ;
if (!i || !i[0])
return E_ARGUMENT ;
if (!cDelim || cDelim == CHAR_DQUOTE)
cDelim = CHAR_COMMA ;
for (;;)
{
if (*i == CHAR_DQUOTE)
{
for (i++ ; *i ; i++)
{
if (*i == CHAR_BKSLASH)
{
if (i[1]== ''r''){i++ ; C.AddByte(CHAR_CR) ; continue ; }
if (i[1]== ''n''){i++ ; C.AddByte(CHAR_NL) ; continue ; }
if (i[1]== ''t''){i++ ; C.AddByte(CHAR_TAB) ; continue ; }
if (i[1]== ''"''){i++;C.AddByte(CHAR_DQUOTE);continue; }
}
if (i[0]== CHAR_DQUOTE && i[1]== CHAR_DQUOTE)
{ i++ ; C.AddByte(CHAR_DQUOTE) ; continue ; }
if (*i == CHAR_DQUOTE)
break ;
C.AddByte(*i) ;
}
if (*i == CHAR_DQUOTE)
i++ ;
else
break ;
}
if (*i == 0|| *i == cDelim)
{
S = C ; ar.Add(S) ; C.Clear() ; S.Clear() ;
if (*i == 0)
break ;
i++ ;
continue ;
}
// Just add char to chain
if (*i == CHAR_BKSLASH)
{
if (i[1]== ''r''){i++ ; C.AddByte(CHAR_CR) ; continue ; }
if (i[1]== ''n''){i++ ; C.AddByte(CHAR_NL) ; continue ; }
if (i[1]== ''t''){i++ ; C.AddByte(CHAR_TAB) ; continue ; }
if (i[1]== ''"''){i++;C.AddByte(CHAR_DQUOTE);continue; }
}
C.AddByte(*i) ;
i++ ;
}
return E_OK ;
}