从 excel/文本文件中读取而不跳过空格,除非由选项卡制作

Posted

技术标签:

【中文标题】从 excel/文本文件中读取而不跳过空格,除非由选项卡制作【英文标题】:Reading from excel/text file without skipping whitespaces unless made by a tab 【发布时间】:2017-04-01 00:31:08 【问题描述】:

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

我有 C++ 的基本知识,没什么特别的,但如果我没记错的话,istreams 在遇到空格时会停止读取,并且不会区分制表符空格或普通空格键空格。谁能帮我解决这个问题,以便我可以正确存储数据并制定我的 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 阿拉巴马州电力公司 3 N Rock 阿拉巴马州电力公司 4 N Walt Boulder Co 阿拉巴马州电力公司 10 N 3 格林县阿拉巴马州电力公司 46 N 1 布朗斯渡轮田纳西河谷管理局

说明我遇到的问题,如果我有四列的 4 个字符串数组,在第一行,3 将分配给 array1,N 分配给 array2,Rock 分配给 array3,Elec 分配给 array4。但是,在第 3 行中,4 将分配给数组 1,N 将分配给数组 2,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】:

只是一些提示。

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

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

这适用于制表符分隔的文本文件。如果您的 excel 文件不是制表符分隔的,那么您需要将副本另存为制表符分隔。

【讨论】:

以上是关于从 excel/文本文件中读取而不跳过空格,除非由选项卡制作的主要内容,如果未能解决你的问题,请参考以下文章

替换字符串中的单词而不跳过空格

Xcopy共享违规,如何仍然复制而不跳过

如何在不跳过值的情况下读取 PHPExcel 中的空单元格?

Python:如何在迭代列表时从列表中删除元素而不跳过未来的迭代

从文件中读取时一次跳过空格

使用 SQL Server Rank 函数对行进行排名而不跳过排名号