C++将csv文件加载到二维矢量

C++. Loading csv files to 2D vectors

本文关键字:二维 csv 文件 加载 C++      更新时间:2023-10-16

我已经将CSV文件(platforms.csv)加载到2D向量中,看起来没有问题,但当我从[0][0]操作字符串时,它的行为很奇怪。有人能帮我找出问题吗?

我的目标是简单地将CSV文件加载到2D向量中,并能够像操作任何其他字符串一样操作字符串。这个初始CSV文件包含其他CSV文件的名称(没有.csv扩展名),所以我最终想将.csv添加到platforms.csv中加载到platformsCSV中的所有字符串中。

platforms.csv的内容很简单:

PrestaShop
osCommerce

我得到的输出是:

PrestaShop
osCommerce
.csvtaShop
osCommerce.csv

这是我的代码:

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
void readCSV(string &readFileName, vector< vector<string> > &output, int &colCount, int &rowCount)
{
    fstream file(readFileName, ios::in);
    if(!file.is_open())
    {
        cout << "File not found!nEnter correct file name: ";
        cin >> readFileName;
    }
    colCount = 0, rowCount = 0;
    string csvLine;
    while( getline(file, csvLine) )
    {
        istringstream csvStream(csvLine);
        vector<string> csvColumn;
        string csvElement;
        while( getline(csvStream, csvElement, ',') )
        {
            csvColumn.push_back(csvElement);
            colCount++;
        }
        output.push_back(csvColumn);
        rowCount++;
    }
    colCount=colCount/rowCount;
    file.close();
}
void writeCSV(string &writeFileName, vector< vector<string> > &csvData, int &colCount, int &rowCount)
{
    ofstream myfile;
    myfile.open (writeFileName);
    int x = 0, y = 0;
    while(y<rowCount) {
        x=0;
        while (x<colCount-1) {
            myfile << csvData[y][x] << ",";
            x++;
        }
        myfile << csvData[y][x] << "n";
        y++;
    }
    myfile.close();
}

int main()
{
    int colCount, rowCount;
    string platformsFile = "platforms.csv";
    vector< vector<string> > platformsCSV;
    readCSV(platformsFile, platformsCSV, colCount, rowCount);
    cout << "n";
    cout << "n" << platformsCSV[0][0];
    cout << "n" << platformsCSV[1][0];
    string x = platformsCSV[0][0] + ".csv";
    string y = platformsCSV[1][0] + ".csv";
    cout << "n";
    // What's wrong here???
    cout << "n" << x;
    cout << "n" << y;
    cout << "n";    
    return 0;
}

这不是C++代码的问题。这是CSV行末尾的问题。

如果我没有错的话,显然。

我已经复制了你的问题,得到

.csvtaShop
.csvmmerce

在linux平台中,文本文件中的行以LF(0x0a)结尾,使用dos行结尾的CSV文件(CR+LF,0x0d+0x0a)。

getline()csvElement"Prestashop\x0d"answers"osCommerce\x0d"中加载,加载'\x0d'字符。

当我打印platformsCSV[0][0]platformsCSV[1][0]时,我得到

PrestaShop
osCommerce

因为"\x0d"字符是不可见的。

我的xy变为"PrestaShop\x0d.csv"answers"osCommerce\x0d.csv"。

打印xcout时写"PrestaShop",然后是"\x0d"字符,即:转到行的左侧,然后是覆盖"Pres"的".cvs"部分。

与我的y非常相似。

如果你得到

.csvtaShop
osCommerce.csv

我假设你在Linux(或Unix)平台上工作,你的CSV文件在第一行末尾以CR+LF结尾,但在第二行末尾没有行尾。

为了验证我的假设是否正确,你可以添加

for ( unsigned i = 0 ; i < x.size() ; ++i )
   std::cout << '[' << int(x[i]) << ']';
std::cout << 'n';

main() 结束时

我得到

[80][114][101][115][116][97][83][104][111][112][13][46][99][115][118]

其中"\x0d"是[13]

解决方案(如果我的假设是正确的):将CSV文件转换为unix文本文件。

抱歉我英语不好。