使用MFC将数据写入CSV文件

去年接手了一个项目,要求使用某ADC的接口实现一个波形显示器,由于该ADC驱动给的接口只有C++的能看懂且能用,因此考虑到兼容性选了MFC作为开发框架。在实现过程中,需要实现一个将已获取数据保存的功能,而第一想法便是保存为csv文件。因此,在此记录一下MFC进行csv文件创建,写入的方法:

1.创建文件:

FILE *f = NULL;
CString CSVFileName = CTime::GetCurrentTime().Format("DataSave_%m-%d_%H-%M-%S.csv"); //以系统时间创建数据文件
if (_tfopen_s(&f, CSVFileName, _T("wb")) != 0) //创建文件
{
    //处理文件创建结果
}

2.写入一行数据:

CStringArray sLine;     //CSV单行临时数组
CSVTempstr.Format(_T("时间戳"));
sLine.Add(CSVTempstr);
CSVTempstr.Format(_T("采集数值"));
sLine.Add(CSVTempstr);
CSVTempstr.Format(_T("采集量程") + RangeCtrl);
sLine.Add(CSVTempstr);
CSVTempstr.Format(_T("采集频率") + FreqCtrl +_T("Hz"));
sLine.Add(CSVTempstr);
CSVTempstr.Format(_T("修正系数") + CorrectValue);
sLine.Add(CSVTempstr);
PutCSVItemLine(f, sLine); //写入一行数据

3.关闭文件:

fclose(f);                      //关闭CSV文件

4.配套单行数据写入函数:

//将数据项写入CSV文件
int PutCSVItemLine(FILE* file, CStringArray& sItemLine)
{
  //准备行数据
  CStringA sLineString;

  //循环取子项
  for (INT_PTR nItem = 0; nItem < sItemLine.GetSize(); nItem++)
  {
    //取子项
    CStringA sItem(sItemLine.GetAt(nItem));

    //查找是否包含引号或逗号
    if (sItem.FindOneOf("\",\r\n") >= 0)
    {
      //单引号替换为双引号
      sItem.Replace("\"", "\"\"");

      //首尾用引号包含
      sItem.Insert(0, "\""); sItem += "\"";
    }

    //添加逗号分隔符
    if (!sLineString.IsEmpty()) sLineString += ",";

    //追加数据
    sLineString += sItem;
  }

  //行尾添加\r\n
  sLineString += "\r\n";

  //写入文件
  return (int)fwrite((LPCSTR)sLineString, 1, sLineString.GetLength(), file);

}

5.完整应用:

//应用实例
void TestCSV()
{
  FILE *f = NULL;
  if(_tfopen_s(&f, _T("E:\\TEMP\\test.csv"), _T("wb")) == 0)
  {
    {
      CStringArray sLine;
      sLine.Add(_T("1"));
      sLine.Add(_T("\"2\""));
      sLine.Add(_T("3,ABC"));
      sLine.Add(_T("4"));
      sLine.Add(_T("\"\""));
      sLine.Add(_T(","));
      sLine.Add(_T("\",\""));
      sLine.Add(_T(""));
      sLine.Add(_T("aaa\",\"bbb"));
 
      PutCSVItemLine(f, sLine);
    }
 
    {
      CStringArray sLine;
      sLine.Add(_T("1"));
      sLine.Add(_T("\"2\""));
      sLine.Add(_T("3,ABC"));
      sLine.Add(_T("4"));
      sLine.Add(_T("\"\""));
      sLine.Add(_T(","));
      sLine.Add(_T("\",\""));
      sLine.Add(_T(""));
      sLine.Add(_T("aaa\"??bbb\""));
 
      PutCSVItemLine(f, sLine);
    }
 
 
    fclose(f);
  }

感谢https://blog.csdn.net/zgl7903/article/details/104495742/ 提供当时的解决思路。

点赞

发表回复

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像(暂时停用!)

Title - Artist
0:00