MFC 读取CSV文件时 当一个单元格内容里有",的处理方法

klose1013 2020-01-08 03:24:01
从大佬 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();

}
...全文
199 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
klose1013 2020-01-09
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
博客已更新
请收下膝盖
schlafenhamster 2020-01-09
  • 打赏
  • 举报
回复
多空格 分割 时
CString aline="aaa\",bbb ccc ddd rrrrr";
int Start=0;
int End=-1;
CStringArray Cols;
CString tmp;
while(1)
{
End=aline.Find(" ",Start);
// last col !
if (End<0) End=aline.GetLength();
tmp=aline.Mid(Start,End-Start);
// skip multi spaces !
if(tmp != "")
{
Cols.Add(tmp);
afxDump << tmp << "\n";
}
if(End==aline.GetLength()) break;
Start=End+1;
}
待续_1006 2020-01-09
  • 打赏
  • 举报
回复
这个就是字符串分割,只要明确知道分割字符是什么就OK了啊!核心在于要懂得如何分割一个字符串!
zgl7903 2020-01-08
  • 打赏
  • 举报
回复
schlafenhamster 2020-01-08
  • 打赏
  • 举报
回复
确认 字段分隔符 是 空格 !

CString aline="aaa\",bbb ccc ddd";
int Start=0;
int End=-1;
int at=-1;
CStringArray Cols;
while(Start>=0)
{
End=aline.Find(" ",Start);
// last col !
if (End<0) End=aline.GetLength();
afxDump << aline.Mid(Start,End-Start)<<"\n";
Cols.Add(aline.Mid(Start,End-Start));
if(End==aline.GetLength()) break;
Start=End+1;
}

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧