使用复制和 ostream_iterator 删除为矢量编写的 CSV 文件中的尾随逗号
Remove trailing comma in CSV file written for a vector using copy and ostream_iterator
我有以下函数,它将 vector
写入 CSV 文件:
#include <math.h>
#include <vector>
#include <string>
#include <fstream>
#include <iostream>
#include <iterator>
using namespace std;
bool save_vector(vector<double>* pdata, size_t length,
const string& file_path)
{
ofstream os(file_path.c_str(), ios::binary | ios::out);
if (!os.is_open())
{
cout << "Failure!" << endl;
return false;
}
os.precision(11);
copy(pdata->begin(), pdata->end(), ostream_iterator<double>(os, ","));
os.close();
return true;
}
但是,CSV 文件的结尾如下所示:
1.2000414752e-08,1.1040914566e-08,1.0158131779e-08,9.3459324063e-09,
也就是说,在文件中写入了一个尾随逗号。当我尝试使用另一个软件程序加载文件时,这会导致错误。
摆脱(最好不要写)这个尾随逗号的最简单、最有效的方法是什么?
我会通过特殊处理第一个元素来省略打印逗号:
if (!pdata->empty()) {
os << pdata->front();
std::for_each(std::next(pdata->begin()), pdata->end(),
[&os](auto&& v){ os << ", " << v; });
}
显然,此代码进入打印可打印范围适配器的函数。
正如您所观察到的,通过 std::copy
进行复制并没有起到作用,一个额外的 ,
被输出。有一个提案可能会成为未来的 C++17 标准:ostream_joiner
,它将完全符合您的期望。
但是,现在可用的快速解决方案是手动完成。
for(auto it = std::begin(*pdata); it != std::end(*pdata); ++it)
{
if (it != std::begin(*pdata))
std::cout << ",";
std::cout << *it;
}
还有很多方法,除了已经列出的:
std::string sep;
for (const auto& x : *pdata) {
os << x << clusAvg;
sep = ", ";
}
或
auto it = pdata->begin();
if (it != pdata->end()) {
os << *it;
for(; it != pdata->end(); ++it)
os << ", " << *it;
}
或
auto it = pdata->end();
if (it != pdata->begin()) {
--it;
std::copy(pdata->begin(), it, ostream_iterator<double>(os, ", "));
os << *it;
}
我有以下函数,它将 vector
写入 CSV 文件:
#include <math.h>
#include <vector>
#include <string>
#include <fstream>
#include <iostream>
#include <iterator>
using namespace std;
bool save_vector(vector<double>* pdata, size_t length,
const string& file_path)
{
ofstream os(file_path.c_str(), ios::binary | ios::out);
if (!os.is_open())
{
cout << "Failure!" << endl;
return false;
}
os.precision(11);
copy(pdata->begin(), pdata->end(), ostream_iterator<double>(os, ","));
os.close();
return true;
}
但是,CSV 文件的结尾如下所示:
1.2000414752e-08,1.1040914566e-08,1.0158131779e-08,9.3459324063e-09,
也就是说,在文件中写入了一个尾随逗号。当我尝试使用另一个软件程序加载文件时,这会导致错误。
摆脱(最好不要写)这个尾随逗号的最简单、最有效的方法是什么?
我会通过特殊处理第一个元素来省略打印逗号:
if (!pdata->empty()) {
os << pdata->front();
std::for_each(std::next(pdata->begin()), pdata->end(),
[&os](auto&& v){ os << ", " << v; });
}
显然,此代码进入打印可打印范围适配器的函数。
正如您所观察到的,通过 std::copy
进行复制并没有起到作用,一个额外的 ,
被输出。有一个提案可能会成为未来的 C++17 标准:ostream_joiner
,它将完全符合您的期望。
但是,现在可用的快速解决方案是手动完成。
for(auto it = std::begin(*pdata); it != std::end(*pdata); ++it)
{
if (it != std::begin(*pdata))
std::cout << ",";
std::cout << *it;
}
还有很多方法,除了已经列出的:
std::string sep;
for (const auto& x : *pdata) {
os << x << clusAvg;
sep = ", ";
}
或
auto it = pdata->begin();
if (it != pdata->end()) {
os << *it;
for(; it != pdata->end(); ++it)
os << ", " << *it;
}
或
auto it = pdata->end();
if (it != pdata->begin()) {
--it;
std::copy(pdata->begin(), it, ostream_iterator<double>(os, ", "));
os << *it;
}