C++按列读取txt文件并保存,替代excel处理
问题描述
原内容为txt格式,每行数据以“逗号”为分割。目标为提取其中4、5列,单独以“空格”为分割存储到新的txt文件中。使用方法
在命令行中输入g++ extract.cpp -o extract
(extract.cpp为本cpp名称,extract为可执行文件名称)在命令行输入
./extract in.txt out.txt
(in.txt为原数据文件,out.txt为输出文件名。假如在cpp程序中修改了默认值,也可以直接./extract
即可。
程序
#include <iostream>#include <fstream>#include <sstream>#include <cassert>#include <string>#include <vector>#include <iomanip>using namespace std;int main(int argc, char ** argv){//输入文件和输出文件赋默认值string filename_in,filename_out;filename_in = "./111.txt";filename_out = "./222.txt";//通过可执行文件传参if (argc < 2){cout << "use the default path" << endl;}else{filename_in = argv[1];filename_out = argv[2];}cout << "filename_in = " << filename_in << endl;cout << "filename_out = " << filename_out << endl;//以只读形式(ios::in)打开输入文件ifstream file_in;file_in.open(filename_in, ios::in);if(!file_in.is_open()){cout << "failed in openning " << filename_in <<endl;return 0;}//以覆盖形式(ios::trunc)打开输出文件ofstream file_out;file_out.open(filename_out, ios::trunc);if(!file_in.is_open()){cout << "failed in openning " << filename_out <<endl; }//按行读取并存储到lines容器中vector<string> lines;string temp;while(getline(file_in, temp)){lines.push_back(temp); }//提取每行第4、5个元素,以空格为分隔for (auto it = lines.begin()+1; it != lines.end(); it++){istringstream line(*it); //单行数据string temp;//单行中第i个数据int i = 0;//原始数据以逗号分隔while(getline(line, temp, ',')){//以6为固定精度输出每行第4、5个元素,stod为string转doubleif(i == 4)file_out << fixed << setprecision(6) << stod(temp) << " "; //以空格为间隔,需要可改为逗号等其他符号if(i == 5)file_out << fixed << setprecision(6) << stod(temp) << endl; //没读取一行换行保存,不需要则可以替换endl为其他符号i++;}}//关闭输入输出文件file_in.close();file_out.close();return 0;}