【问题标题】:Overcoming Issues When Downloading a CSV File for Parsing. Linux vs Windows New Line Charachter克服下载 CSV 文件进行解析时的问题。 Linux 与 Windows 换行符
【发布时间】:2017-11-16 05:32:41
【问题描述】:

我正在尝试使用历史股票价格分析股票数据。这些数据可以从 Yahoo Finance(https://finance.yahoo.com/quote/AAPL/history?p=AAPL) 下载为 CSV 文件。但是,当我下载文件时,它被组织为一行,并且在每一行的末尾没有被新行分隔。我读过这是因为不同的操作系统使用不同的字符来表示新行。下载文件或在文本编辑器中是否有办法克服这个问题,或者我应该修改我的代码以适应文件下载的格式。我在 Windows 10 上用 C++ 编码并在记事本中查看文件。 (我也是 StackOverFlow 的新手,因此非常感谢您提出问题的建议。)

示例: 代码应该是怎样的

2017-10-16,157.899994,160.000000,157.649994,159.880005,159.307312,24121500

2017-10-17,159.779999,160.869995,159.229996,160.470001,159.895203,18997300

2017-10-18,160.419998,160.710007,159.600006,159.759995,159.187729,16374200

2017-10-19,156.750000,157.080002,155.020004,155.979996,155.421280,42584200

2017-10-20,156.610001,157.750000,155.960007,156.250000,155.690308,23974100

如何下​​载

2017-10-16,157.899994,160.000000,157.649994,159.880005,159.307312,241215002017-10-17,159.779999,160.869995,159.229996,160.470001,159.895203,189973002017-10-18,160.419998,160.710007,159.600006,159.759995,159.187729,163742002017-10-19,156.750000 ,157.080002,155.020004,155.979996,155.421280,425842002017-10-20,156.610001,157.750000,155.960007,156.250000,155.690308,239741>p>

我在文件中读取的代码

void Stock::readData(filename){
ifstream stream;
stream.open(fileName);

if(stream.fail()){
    cout << "The file " << fileName <<" failed to open." << endl;
    return;
}


string line ="";
cout << line << endl;

while(!stream.eof()){

   // cout << '*' << endl;
    getline(stream,line);
   //cout << line << endl;

    string parsed[7];

    int num = Spliter(line, ',', parsed, 7);

    string tempDate;
    float tempOpen;
    float tempHigh;
    float tempLow;
    float tempClose;
    float tempCloseAdj;
    float tempVolume;

    /*for(int i=0; i<num; i++){
        cout << parsed[i] << endl;
   }*/

    tempDate = parsed[0];
    tempOpen = stof(parsed[1]);
    tempHigh = stof(parsed[2]);
    tempLow = stof(parsed[3]);
    tempClose = stof(parsed[4]);
    tempCloseAdj = stof(parsed[5]);
    tempVolume = stof(parsed[6]);


/*
    cout <<(tempDate) << " ";
    cout << (tempOpen)<< " ";
    cout << (tempHigh)<< " ";
    cout << (tempLow)<< " ";
    cout << (tempClose)<< " ";
    cout << tempCloseAdj<< " ";
    cout << (tempVolume) << endl;
*/

    vector<float> v;

    dates.push_back(tempDate);
    data.push_back(v);
    data[numberOfDays].push_back(tempOpen);
    data[numberOfDays].push_back(tempHigh);
    data[numberOfDays].push_back(tempLow);
    data[numberOfDays].push_back(tempClose);
    data[numberOfDays].push_back(tempCloseAdj);
    data[numberOfDays].push_back(tempVolume);
   // cout << '#' << endl;

    numberOfDays++;
}

stream.close();

}

【问题讨论】:

  • 你的代码 sn-p 在哪里? stackoverflow.com/help/how-to-ask
  • 能否提供一个独立于任何标头运行的代码? Spliter 来自哪里?如果代码确实包含#includes、main 函数等,那就更好了。具有相同问题的行数尽可能少的工作示例使您的问题更具吸引力和可读性。

标签: c++ linux windows csv delimiter


【解决方案1】:

我发现了问题所在。为了在 Mac、Windoxs 或 Unix 等平台之间转换 EOL 行尾,请下载 Notepad++ 等文本编辑器。在 notepadd++ 中打开文件并转到编辑选项卡。找到 EOL 转换按钮并使用它来转换文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多