【问题标题】:Writing multidimensional to CSV file将多维写入 CSV 文件
【发布时间】:2014-08-20 21:58:35
【问题描述】:

我有一个相当大的二维字符串向量,我想写入 CSV 文件,但我的代码在写入时崩溃。有什么建议吗?

if (outfile.is_open()) {
    for (int i = 0; i < width.size() - 1; i++) {
        for (int j = 0; j < rows.size() - 1; j++) {
            outfile << cells[i][j] << ",";
        }
        outfile << endl;
    }
} else cout << "Unable to write.";

宽度、行和单元格的声明:

//Declare stuff
vector<string> rows, cols, width;
vector< vector<string> > cells;
string line;

//Open input file
std::ifstream infile("99-110.csv", ios_base::in);
std::ofstream outfile("99-110_corr.csv", ios_base::out);


//Create vector with each row as an index
while (getline(infile, line)) {
    rows.push_back(line);
    width = split(rows[0], ",");
}

//Split each vector index into a 2D vector
for (int i = 0; i < rows.size(); i++) {
    cols = split(rows[i], ",");
    cells.push_back(cols);
}

事实证明,我将 rows.size() 和 width.size() 混淆了。我交换了它们,现在一切似乎都适用于小文件,但对于大于约 500 MB 的文件,我的脚本在抛出“std::bad_alloc”实例后调用 terminate 崩溃。它似乎在 for 循环期间崩溃,我将每个向量索引拆分为 2D 向量(上面提供的最后一个 for 循环)。向量“单元格”的最大大小为 357,913,941,但我计算出向量的实际大小为 97,780,085。

【问题讨论】:

  • Any suggestions? 使用调试器。
  • cells 真的是width.size() * rows.size() 矩阵吗?并且索引按显示的代码中的顺序排列?你能告诉我们widthrowscells的声明和初始化吗?
  • @JoachimPileborg 按要求进行了编辑。上面引用的 split 函数只是解析一个 csv 文件并用逗号分隔每一行。所以是的,我确定单元格是列 width.size() 和 rows.size()。
  • uhmmm,错了,每次放东西都在改变宽度。你不能确定它是否和cells[i].size()一样大小。
  • 对,但我知道行数和列数将始终与初始读取相同。这是一个方阵。

标签: c++ arrays csv io


【解决方案1】:

为什么需要rows, cols, widthcells 包含我想你需要的所有信息,所以:

for (int i = 0; i < cells.size(); i++) { // start from i=1 to skip header
    for (int j = 0; j < cells[i].size(); j++) {

你会读到cells,比如:

while (getline(infile, line))
   cells.push_back(split(line, ","));

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 2018-03-08
    • 2015-08-07
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2017-07-01
    • 2019-01-29
    相关资源
    最近更新 更多