在C++中检测到的行为“N/A”或“\0”时,尝试跳过CSV文件中的行

rjee0c15  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(124)

我已尝试在以下情况下使用此选项(temp ==“N/A”||temp=="\0”)函数,但在抛出“std::invalid_argument”what()的示例后,我一直收到调用终止的错误:斯托伊

istream & operator >>(istream & input, wLogVec & data) //overloaded input string op
{
    WindLog windLog;
    string line;
    int count = 0;
    while(getline(input, line))
    {
        if(count!=0)
        {
            stringstream ss(line);
            string temp;
            Date date;
            Time time;

            ss >> date >> time;
            for(int i=0; i<9; i++) //skip unnecessary columns
            {
                getline(ss, temp, ',');
            }
            getline(ss, temp, ',');
            if(temp =="N/A" || temp=="\0")
            {
                continue;
            }
            float speed = stof(temp);
            getline(ss, temp, ',');
            float solRad = (stof(temp));
            for(int i=0; i<5; i++) //skip unnecessary columns
            {
                getline(ss, temp, ',');
            }
            getline(ss, temp);
            float airTemp = stof(temp);
            //Add new WindLog object with parameters into wLogVec vector

            data.Add(new WindLog(date, time, speed, solRad, airTemp));
        }
        count++;
    }
    return input;
}

本人资料如下:

该代码将从某些列中获取输入,当我手动删除csv中的空行时,它将工作,但当存在N/A值或空行时,它将不工作。

t5fffqht

t5fffqht1#

正如Alan Birtles提到的,你应该使用temp.empty而不是temp == "\0"来检查空值(最好写成'\0',但是我不认为这会有什么不同,如果有,请纠正我)基本上,'\0'并不意味着字符串是空的,'\0' * 本身就是一个字符,ASCII表中的第一个字符。
我在excel工作表中做了一个测试,用随机数导出为csv文件,输出如下:

79667,7,484,48,76,87689,7698,5643,643,537,4,7854,754
887657,4,8754,574,764,675,685,876,87,575,65,876,5
,,,,,,,,,,,,
87,9687,678,5687,55,344,364,3735,7635,3765,365,48,74

请注意第二行只有很多逗号,因为逗号之间没有字符,如果实际上有'\0'(空终止符)字符,文件将如下所示:

79667,7,484,48,76,87689,7698,5643,643,537,4,7854,754
887657,4,8754,574,764,675,685,876,87,575,65,876,5
, , , , , , , , , , , ,
87,9687,678,5687,55,344,364,3735,7635,3765,365,48,74

如果使用十六进制查看器打开,您实际上可以看到'\0'字符:I used HxD
因此,总而言之,您不检查'\0'字符,而是检查包含test.empty()的空字符串。

相关问题