C++ 导出CSV文件


#include <string>
#include <fstream>
#include <sstream>

class CsvStream
{
    std::ofstream fs_;
    bool is_first_;
    const std::string separator_;
    const std::string escape_seq_;
    const std::string special_chars_;

public:
    CsvStream(const std::string filename, const std::string separator = ",")
        : fs_()
        , is_first_(true)
        , separator_(separator)
        , escape_seq_("\"")
        , special_chars_("\"")
    {
        fs_.exceptions(std::ios::failbit | std::ios::badbit);
        fs_.open(filename.c_str());
    }

    ~CsvStream()
    {
        flush();
        fs_.close();
    }

    void flush()
    {
        fs_.flush();
    }

    inline static CsvStream& endl(CsvStream& file)
    {
        file.endrow();
        return file;
    }

    void endrow()
    {
        fs_ << std::endl;
        is_first_ = true;
    }

    CsvStream& operator<<(CsvStream& (*val)(CsvStream&))
    {
        return val(*this);
    }

    CsvStream& operator<<(const char* val)
    {
        return write(escape(val));
    }

    CsvStream& operator<<(const std::string& val)
    {
        return write(escape(val));
    }

    template<typename T>
    CsvStream& operator<<(const T& val)
    {
        return write(val);
    }

private:
    template<typename T>
    CsvStream& write(const T& val)
    {
        if (!is_first_)
        {
            fs_ << separator_;
        }
        else
        {
            is_first_ = false;
        }
        fs_ << val;
        return *this;
    }

    std::string escape(const std::string& val)
    {
        std::ostringstream result;
        result << '"';
        std::string::size_type to, from = 0u, len = val.length();
        while (from < len && std::string::npos != (to = val.find_first_of(special_chars_, from)))
        {
            result << val.substr(from, to - from) << escape_seq_ << val[to];
            from = to + 1;
        }
        result << val.substr(from) << '"';
        return result.str();
    }
};

void test() {
    CsvStream file("test.csv");
    file << "col1" << "col2" << "col3" << CsvStream::endl;
    file << "val1" << "val2" << "val3" << CsvStream::endl;
    file << "val1" << "val2" << "val3" << CsvStream::endl;
    file.flush();
}

输出 


创作不易,小小的支持一下吧!

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用C++导出CSV文件并生成饼状图,你可以按照以下步骤进行操作: 1. 导出CSV文件: - 首先,你需要将数据以CSV格式保存到文件中。你可以使用C++文件流操作进行这个操作。例如,你可以使用`std::ofstream`类创建一个输出文件流对象,并将数据写入文件中。确保每行数据都以逗号分隔。 - 以下是一个简单的示例,将一些数据保存为CSV文件: ```cpp #include <iostream> #include <fstream> #include <vector> void exportToCSV(const std::vector<std::string>& data, const std::string& filename) { std::ofstream file(filename); if (file.is_open()) { for (const auto& entry : data) { file << entry << ","; } file.close(); std::cout << "CSV file exported successfully." << std::endl; } else { std::cerr << "Error opening file." << std::endl; } } int main() { std::vector<std::string> data = { "Category1", "Category2", "Category3", "Category4" }; std::string filename = "data.csv"; exportToCSV(data, filename); return 0; } ``` 2. 生成饼状图: - 生成饼状图可以使用各种绘图库,例如Matplotlib、gnuplot等。这些库通常提供用于绘制各种图表的函数。 - 在C++中,你可以使用外部库来调用这些绘图函数,例如通过使用C++的系统调用或使用库的C++绑定。 - 这里以Matplotlib为例,你可以使用Python脚本来生成饼状图。通过在C++中调用Python脚本,你可以将CSV文件中的数据传递给Python脚本,并生成饼状图。 ```cpp #include <iostream> #include <cstdlib> int main() { std::string script = "python plot_pie_chart.py"; int returnCode = std::system(script.c_str()); if (returnCode == 0) { std::cout << "Pie chart generated successfully." << std::endl; } else { std::cerr << "Error generating pie chart." << std::endl; } return 0; } ``` 在这个示例中,你需要创建一个名为`plot_pie_chart.py`的Python脚本,并使用Matplotlib库绘制饼状图。Python脚本可以读取CSV文件中的数据,并生成相应的饼状图。 这样,你就可以通过C++导出CSV文件并生成饼状图了。请确保在执行这些操作之前,你已经安装了相应的库和工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力码力我爱你

创作不易,小小的支持一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值