【问题标题】:How to convert csv file to json using C++如何使用 C++ 将 csv 文件转换为 json
【发布时间】:2014-10-02 18:01:28
【问题描述】:

是否有任何现有的标准框架可以做到这一点?目前我正在将 csv 字段转换为一个数组,然后再转换为一个 JSON 格式的数组,这非常慢。我想知道是否有可用的标准框架或任何其他快速方法?

【问题讨论】:

  • 我发布了应该更快的变体,因为它不使用多个数组(见下文)。希望有帮助。除此之外,当您发布与问题相关的代码的重要部分时,它总是很有帮助。
  • 您有一个小问题,因为 CSV 文件没有真正的标准。

标签: c++ json csv


【解决方案1】:

jscons 允许您在没有 CSV 数据的额外数组的情况下这样做:

#include <iostream>
#include "jsoncons/json.hpp"
#include "jsoncons_ext/csv/csv.hpp"

using namespace std;
using namespace jsoncons;
using namespace jsoncons::csv;

int main(int argc, char** argv) {

    json result = decode_csv<json>(cin);

    cout << result << endl;

    return 0;
}

在 Linux 上,您可以这样使用它(假设 convert 是您编译的二进制文件):

$ cat data.csv | convert

在 Windows 上可能是:

> convert < data.csv

当你想将它与文件名一起使用时,你可以这样做:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stdexcept>

#include "jsoncons/json.hpp"
#include "jsoncons_ext/csv/csv.hpp"

using namespace std;
using namespace jsoncons;
using namespace jsoncons::csv;

int main(int argc, char** argv) {
    try {
        vector<string> arguments(argv + 1, argv + argc);

        if (arguments.size() != 2)
            throw runtime_error("usage: convert <input> <output>");

        ifstream input(arguments[0]);
        ofstream output(arguments[1]);

        if (!input.is_open())
            throw runtime_error(arguments[0] + ": open failed");

        if (!output.is_open())
            throw runtime_error(arguments[1] + ": open failed");

        json result = decode_csv<json>(input);

        output << result << endl;
    }
    catch (exception& e) {
        cout << e.what() << endl;
    }

    return 0;
}

你应该这样称呼它:

$ convert data.csv data.json

要编译所有内容,您必须将文件夹 jsonconsjsoncons_ext 放入包含目录。

【讨论】:

  • 嗨,谢谢你的代码?但是这段代码有效吗?你如何输入csv文件名?我尝试使用Visual Studio 2013,我在运行它后给出了文件名,但它不起作用(它只是保持不变,似乎没有做任何事情),如果可能的话你能给出编译和执行指令,我我是新手。和可能的输入/输出。
  • 这里有问题,这不是照顾数字,这里的一切都是字符串。我的 csv 文件是(name,lname,age\n xyz,p,20\n abc,q,25) 它会给出 [["name","lname","age"],["xyz","p ","20"],["abc","q","25"]],年龄不应该用双引号,我想要{"name":"xyz"形式的数据, "lname":"p","age":20} 等这个库支持吗?
  • 该库有文档。您也可以轻松地覆盖它。也许是一个新问题;)。
  • 目前还不行。 json_deserializer.hpp - 没有找到(
  • 我已经更新了代码以使用更新版本的 jsoncons。
猜你喜欢
  • 2012-06-05
  • 2018-08-20
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2021-08-28
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多