除非通过选项卡

时间:2017-04-01 00:31:08

标签: c++ string fstream

我有一个关于电厂监控的项目,它要求我从两个文件(excel文件或文本文件)中读取数据。数据由97列和515行组成,其中包含整数和字符串的混合。因此,我的想法是声明97个数组,将每列中的值存储到它们各自独立的数组中。但是,某些列包含具有多个单词的字符串。因此,一行可能在一列中有一个单词,而另一行可能有三个等。这是一个问题,因为当我读入行时,当我希望程序读取整个短语时,每个字符串被分配给不同的字符串数组作为一个字符串并将该字符串存储在为该列初始化的数组中。这会导致数据移位,并且某些数据未分配给正确的数组等。

我对C ++有基本的了解,没什么了不起的但是如果我没有弄错的话,当它遇到一个空格并且没有区分制表空间或正常的空格键空间时,它会停止读取。任何人都可以帮我修复这个问题,这样我就可以正确存储数据并开发我的KPI吗?

我已经包含了部分数据,并尝试读取4列代码。请注意,每个列都由数据的文本文件版本中的选项卡分隔。

ID Com NID  Plant                    Operator
3   N       Rock                     Alabama Elec Co
3   N       Rock                     Alabama Elec Co
4   N       Walt Boulder Co          Alabama Elec Co
10  N   3   Greene County            Alabama Elec Co    
46  N   1   Browns Ferry             Tennessee Valley Authority

ID Com NID工厂操作员 3 N Rock Alabama Elec Co. 3 N Rock Alabama Elec Co. 4 N Walt Boulder Co Alabama Elec Co. 10 N 3 Greene County Alabama Elec Co
46 N 1 Browns Ferry田纳西河流域管理局

说明我遇到的问题,如果我有四列的4个字符串数组,在第一行中,3将分配给array1,N分配给array2,Rock分配给array3,Elec分配给array4。但是,在第3行中,4将分配给array1,N将分配给array2,Walt将分配给数组3,但Boulder将分配给数组4而不是存储的整个工厂名称。 第5行发生类似的命运,这会影响数据的组织,并且不允许我正确而准确地操作它。

//numLines is taken from previous code to determine the 
//number of lines in the file
std::string *ID = new std::string[numLines]; 
std::string *YN = new std::string[numLines];
std::string *nuclearID = new std::string[numLines];
std::string *plantName = new std::string[numLines];

std::ifstream infile;
infile.open("nocommagenerationdata.dat");
if (infile.is_open()) {
    int i = 0;
    while (i<numLines) {
        infile >> ID[i] >> YN[i] >> nuclearID[i] >> plantName[i];
        std::cout << ID[i] << YN[i] << nuclearID[i] << plantName[i] << std::endl;

        i++;
    }

}
infile.close();

我最初也尝试使用计数器初始化一个字符串,以查看一行中的数据是否与另一行排成一行,但它清楚地表明由于具有空格问题的字符串中的同名读数而导致数据移位。

std::ifstream infile;
infile.open("nocommagenerationdata.dat");
if (infile.is_open()) {
    int i = 0; std::string temp;
    while (i<numLines) {
        infile >> temp;
        std::cout << i << "." << temp << std::endl;

        i++;
    }

}
infile.close();

我将不胜感激任何帮助

1 个答案:

答案 0 :(得分:0)

只是一些提示。

定义表示您正在从文件中读取的记录的结构或类。您只需要一个数组来保存记录,因为它们是从文件中的每一行构造的。

研究如何使用std :: getline读取文件中的每一行,并调查std :: strtok来解析记录数据的每一行。

这适用于制表符分隔的文本文件。如果excel文件没有制表符分隔,则需要以制表符分隔的方式保存副本。