从大佬 zgl7903 那里了解一个CSV文件解析的处理方法
https://blog.csdn.net/zgl7903/article/details/103734623#comments
出现一个问题没想明白
当CSV文件的一个字段里 出现 ", 时,
处理结果会吧这一个字段分成两个字段内容。
比如
会被识别为
aaa" bbb" ccc ddd
本来是 三列数据,现在是4列了
有什么办法能把字段里的",识别为字段里的内容吗?
还要考虑一个字段里多次出现",的情况
下面是代码
请多指教
//CSVファイル内容処理
int CDlgMaintenance::CsvFileCheck(LPCTSTR szFile,
CTypedPtrArray <CPtrArray, CStringArray *> &szDataArray)
{
FILE *fp = NULL;
if ((fp = _tfopen(szFile, _T("rt"))) != NULL)
{
CStringA chLine;
while (!feof(fp))
{
//行読込
fgets(chLine.GetBuffer(8192), 8192, fp);
chLine.ReleaseBuffer();
//両端スペース削除
chLine.TrimLeft();
chLine.TrimRight();
//文字列分析
CStringArray szDataLines;
int iStart = 0;
while (iStart < chLine.GetLength())
{
BOOL bDone = FALSE;
CStringA szSubData;
//"を探す
int iPosS = chLine.Find("\"", iStart);
if (iPosS == iStart)
{
//",を探す
int iPosE = chLine.Find("\",", iPosS + 1);
if (iPosE < 0)
{
iPosE = chLine.ReverseFind('\"'); //行尾?
}
if (iPosE >= 0)
{
iStart = iPosE + 2;
bDone = TRUE;
}
}
else
{
int iPosE = chLine.Find(",", iStart); //カンマで区切
if (iPosE < 0) iPosE = chLine.GetLength(); //行尾
szSubData = chLine.Mid(iStart, iPosE - iStart);
//CString szSubData_1 = chLine.Mid(iPosE + 1);
if (szSubData == "")
{
AfxMessageBox(_T("データを不備の可能性があります、もう一度確認ください。"));
return -1;
}
iStart = iPosE + 1;
bDone = 1;
}
if (!bDone)
break;
//双引号替换为单引号
szSubData.Replace("\"\"", "\"");
//添加子项
szDataLines.Add(CString(szSubData));
}
int a = szDataLines.GetCount();
if (szDataLines.GetCount() != 3)
{
AfxMessageBox(_T("データを不備の可能性があります、もう一度確認ください。"));
return -1;
}
//行追加
if (szDataLines.GetSize() > 0)
{
CStringArray *pStrA = new CStringArray;
pStrA->Copy(szDataLines);
szDataArray.Add(pStrA);
}
}
int a= szDataArray.GetSize();
szDataArray.RemoveAt(a-1);
//ファイル閉じる
fclose(fp);
}
return (INT)szDataArray.GetSize();
}