求指导C++,csv文件,简单写入

陆小路 2015-04-25 02:06:24

各位,图中为我需要的csv文件格式,但是P.16,FIX等栏占两行不会弄,
我只会占一行,用的是C++ FILE*写入,格式代码如下
str.Format(_T("%s,\t%s,\t%s,\t%.4f,\t%.4f,\t%.4f,\t%.4f,\t%s,\t%.4f,\t%.4f,\t%.4f,\t%.4f,\t%.4f,\t%.4f\n"),
strPairName, PTPair.PT1.strName, PTPair.PT1.strTime, PTPair.PT1.dSurveyTimes,
PTPair.PT1.dSVs, PTPair.PT1.dRMS, PTPair.PT1.dPDOP, strSource,
PTPair.PT1.dX, PTPair.PT1.dY, PTPair.PT1.dH, PTPair.dX_Ave, PTPair.dY_Ave, PTPair.dH_Ave);
fputs(str,fp);,
问题描述的应该清楚了,求指导
...全文
561 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-04-27
  • 打赏
  • 举报
回复
楼主你为什么不将数据导入Excel,然后再另存为.csv格式,最后用记事本打开.csv文件看看呢?
「已注销」 2015-04-26
  • 打赏
  • 举报
回复
csv没有格式信息,不能构造为有合并的单元格的形式 以下是我自己以前写的一个工具,你看看有用就拿去吧(基础MFC的,很容易改为STL的),数据量大的话,最好把返回类型改为参数传引用: CSVTools.h

#pragma once

class FND_DSG_API CCSVTools
{
private:
	CCSVTools();
	~CCSVTools();

public:
	static void ExportToCSVFile(const CString& strFileName, const std::vector<std::vector<CString>>& data);
	static std::vector<std::vector<CString>> ImportDataFromCSV(const CString& strFileName);
};

CSVTools.cpp

#include "stdafx.h"

#include <fstream>

#include "CSVTools.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


using namespace std;


CCSVTools::CCSVTools()
{
}


CCSVTools::~CCSVTools()
{
}

// 按CVS文件格式对一行数据进行解析,格式:单元格内容可用半角双引号引起来,如果内容中没有逗号,
// 则双引号可以省略,否则必须要双引号,每一个单元格的内容之间用半角逗号相隔,最后一个数字之后
// 不能有双引号,如果单元格中有双引号则用两个连续的双引号表示一个双引号
vector<CString> SplitCVSRow(const CString& row)
{
	vector<CString> result;

	CString oneCell = _T("");
	for (int i = 0; i < row.GetLength(); /* Nothing */)
	{
		if (_T('\"') == row[i])
		{
			int j = i + 1;
			while (j < row.GetLength())
			{
				if (j >= row.GetLength()) break; // 没有配对,且已经到最后一个字符

				if (_T('\"') == row[j])
				{
					if (j + 1 >= row.GetLength()) break; // 已经是配对的双引号且到最后一个字符

					if (_T('\"') == row[j + 1])
					{
						oneCell += _T("\""); // 内含两个双引号,是内容,存入文字串中
						j += 2; // 必须跳到下一个字符
						continue;
					}
					else
					{
						// j + 1处不是双引号,说明j处的双引号已经是与i配对的结束双引号
						if (_T(',') == row[j + 1])
							j += 2;
						else
							j += 1;

						break;
					}
				}
				else
				{
					oneCell += row[j];
					++j;
				}
			}

			// 双引号对应的一整个单元格处理完毕
			result.push_back(oneCell);
			oneCell = _T("");
			i = j;
		}
		else if (_T(',') == row[i])
		{
			result.push_back(oneCell);
			oneCell = _T("");
			++i;
		}
		else
		{
			oneCell += row[i];
			++i;
		}
	}

	if (_T("") != oneCell) result.push_back(oneCell); // 最后一个数存起来

	return result;
}


void CCSVTools::ExportToCSVFile(const CString& strFileName, const vector<vector<CString>>& data)
{
	if (data.empty()) return;

	CStdioFile file(strFileName, CFile::modeCreate | CFile::modeWrite);
	try
	{
		CString strFileText;
		CString strCell;

		// 将数据转为逗号分隔每一行
		for (size_t i = 0; i < data.size(); ++i)
		{
			const vector<CString>& dataRow = data[i];

			for (size_t j = 0; j < dataRow.size(); ++j)
			{
				strCell = dataRow[j];
				strCell.Replace(_T("\""), _T("\"\"")); // 单元格中有双引号,写到文件要变为两个连续双引号
				if (-1 != strCell.Find(_T(',')) || -1 != strCell.Find(_T('\"')))
					strCell = _T("\"") + strCell + _T("\""); // 单元格中包含了逗号和双引号,则整个内容要有双引号括起来

				strFileText += strCell;
				if (j < dataRow.size() - 1) strFileText += _T(","); // 最后一个后面不要逗号
			}

			if (i < data.size()) strFileText += _T("\n");
		}

		file.WriteString(strFileText);
	}
	catch (CException*)
	{
		// Nothing;
	}

	file.Close();
}

std::vector<std::vector<CString>> CCSVTools::ImportDataFromCSV(const CString& strFileName)
{
	vector<vector<CString>> data;

	try
	{
		ifstream ifs;
		ifs.open(strFileName);

		string strRow;
		while (getline(ifs, strRow))
		{
			CString strTRow = CStringTools::stringToCString(strRow);
			vector<CString> vecRow = SplitCVSRow(strTRow);

			if (vecRow.empty()) continue;
			data.push_back(vecRow);
		}

		ifs.close();
	}
	catch (...)
	{
		return data;
	}

	// 确保所有行的数据列一样多,列按最大列计算,不足的数据以空格填充
	size_t szMax = 0;
	for (auto& x : data)
		if (x.size() > szMax) szMax = x.size();

	if (0 == szMax)
	{
		data.clear();
	}
	else
	{
		for (auto& x : data)
			x.resize(szMax, _T(""));
	}

	return data;
}

陆小路 2015-04-25
  • 打赏
  • 举报
回复
来人啊,csdn如此冷清了???
陆小路 2015-04-25
  • 打赏
  • 举报
回复
不能沉,在线等!

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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