C++改写csv文件指定行列的数据——记录贴

参考博文连接
最近做货位分配功能,用csv文件记录仓库货位的存储状态,0表示空,1表示占用,即不可用;系统每次先读取csv文件,记录货位信息状态,在得到最优货位分配方案之后,更新货位信息,即csv文件
具体改写操作流程可分为
1)读取源文件并将字符串保存到vector1中;
2)根据最佳货位分配方案,标记需要改写的某行某列;如3行4列
3)将3行的字符串提取出来,将每列的内容加上逗号再存入另一个vector2,将第4列的数据由0变为1;
4)重复以上操作,全部更新完毕后,将vector1的内容再重新写入文件中
简单来说,整个过程可以看作是,将内容提取出来,放在一个容器中,改写容器中的内容,再将改后的内容写入原文件中,值得注意的由2点:一是要将写入的内容以逗号隔开,二是在改写过程中是将某行内容转化为vector,以边完成对指定列的改写
改写前的csv文件:

代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

void Correct(string& a, int col)
{
	//cout << "替换前的a:" << a << endl;
	int num_content = 4;
	vector<string> tmp_store;
	string final;//定义最后得到的字符串
	string new_Content="1";//改写的内容
	char b[100];
	strcpy_s(b, a.c_str());
	string temp;
	char delima[] = ",";
	char* result = NULL;
	char* p=NULL;
	result = strtok_s(b, ",",& p);//以逗号分隔
	int cont = 0;
	while (result != NULL)
	{
		cont++;
		temp = result;
		if (cont < num_content)
		{
			temp += ',';
		}
		tmp_store.push_back(temp);//将每列的内容加上逗号重新存入入vector 
		result = strtok_s(NULL, ",",&p);
	}
	tmp_store[col - 1] = new_Content + ',';//改写指定列的内容
	for (int i = 0; i < tmp_store.size(); i++)
	{
		final += tmp_store[i];//将tmp_store的内容放入字符串中
	}
	a = final;
	//cout << "替换后的a:" << a << endl;
	return;
}

int main()
{
	string str_1;
	string str_2;
	ifstream rFile_1("文件名.csv", ios::in);
	vector<string>Content_1;//存放文件中的内容
	if (rFile_1.fail())
	{
		cout << "读取文件失败" << endl;
	}
	while (getline(rFile_1, str_1))
	{
		Content_1.push_back(str_1);
	}
	rFile_1.close();
	int ind =3;//根据算法求解得到的最终粒子解中的最佳个体索引,算法太长,这边就不展示了,只陈列结果
	for (int i = 0; i < 4; i++)//此处的4指需要改写的个数,源码中是一个变量,此处我直接给出结果
	{
		int row = Parent.individualSet[ind].Gene[1][i];//最优解中货位对应csv文件中应修改的行数,根据解的内容分别需要改写3行1列的,4行1列的,1行3列,3行2列
		int col= Parent.individualSet[ind].Gene[2][i];//最优解中货位对应csv文件中应修改的列数
		//cout << "替换前的大小:"<<Content_1[row - 1].size() << endl;
		//cout << "替换前的内容:" << Content_1[row - 1] << endl;
		//改写的函数
		Correct(Content_1[row - 1], col);
		//cout << "替换后的大小:" << Content_1[row - 1].size() << endl;
		//cout << "替换后的内容:" << Content_1[row - 1] << endl;
		//cout << Content_1[row - 1];	
	}
	//重新写入
	ofstream File_1("文件名.csv");
	for (int i = 0; i < Content_1.size(); i++)
	{
		File_1 << Content_1[i] << endl;
	}
	File_1.close();

}

改写后结果:
可以看到原文件中3行1列的,4行1列的,1行3列,3行2列的值已从0变为1
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值