将文件读入以逗号和换行符分隔的向量

Posted

技术标签:

【中文标题】将文件读入以逗号和换行符分隔的向量【英文标题】:Reading File into Vector Delimited by Comma and New Line 【发布时间】:2015-11-23 21:45:54 【问题描述】:

假设我想读取一个 .txt 文件并以这种方式格式化

Max,1979
Wade,1935
Hugh,1983
Eric,1936

这是我使用的代码

    读入文件。

    将其存储到字符串和 int 的向量中(分别用于姓名和年份)

    void calcAges()
    while (getline(infile, line, ','))
        names.push_back(line);
        years.push_back(line);
    
    
    
    void printNames()
    cout << "\n\tDisplaying data...\n";
    
        for (int i = 0; i < counter; i++)
            cout << (i + 1) << ".\tName: " << names[i] << "\tYear: " << years[i] << endl;
        
    
    

输出应如下所示:

1.    Name: Max    Year: 1979
.
.
.
and so on...

但是,我在尝试制作它时遇到了麻烦,因此我读入“infile”的文件以逗号和换行符分开。我将这些变量存储到向量数组中,以便稍后进行排序和切换。在这一点上我很难过。

【问题讨论】:

在附加到 years 之前添加另一个 getline(infile,line)(这次没有分隔符)。然后这将读取该行的其余部分 不敢相信我竟然想到了这个!但是,当我尝试输入第二个“getline(infile,line)”时,我收到一条错误消息,说 getline 不能接受 int?除此之外,将我的年份向量更改为字符串会使代码正常。但是存储年份的字符串向量是没有意义的。不过非常感谢! 当你推入years时,你必须明确地将 line 转换为 int 【参考方案1】:

一旦您将“,”作为分隔符,新行将被视为普通字符。所以使用getline() 而不指定分隔符(默认为新行)并尝试从您获得的字符串中提取名称和年份。使用find_first_of()substr() 可以很容易地做到这一点

例子:

while(getline(infile,str))

     int index = str.find_first_of(',');
     string name = str.substr(0,index);
     string date = str.substr(index+1);
      // Do something with name and date


【讨论】:

谢谢你!但是我试图理解子字符串的第二部分。当您说 (index + 1) 时,您是在说“逗号之后以及之后的任何内容”吗?在文本文件('\n')中看到新行后它是否也会停止读取? “str”一次只包含一行。所以第二行一直读到该行的末尾。是的,逗号后的任何内容都放入第二个字符串。 我明白了,谢谢。这对我很有帮助。因此,如果文本文件行是例如 Max, 1979 带有逗号和空格的名称,我会写: string date = str.substr(index+2);?【参考方案2】:

当涉及到此类操作时,StringStream 的功能要强大得多。但是,在您的情况下(这被认为相当简单),您可以对字符串进行简单的操作。 我建议将每一行读入您的临时字符串,然后用逗号将其拆分并将值添加到您的向量中,如下所示:

void calcAges()
    while (getline(infile, line))  // Read a whole line (until it reads a '\n', by default)
        names.push_back(line.substr(0,line.find(",")); // Read from the beginning of the string to the comma, then push it into the vector
        years.push_back(std::stoi(line.substr(line.find(",") + 1)); // Read from the comma to the end of the string, parse it into an integer, then push it into the vector
    

我假设您使用来自&lt;string&gt; 库的std::string 作为line 变量的类型。

顺便说一句,我没有编译和测试这个,所以我不确定它是否会按原样工作,但我写它只是为了让你了解逻辑方法

干杯

【讨论】:

这行得通,所以我想读取文件的最佳方法之一是逐行执行,然后从该行开始工作?通过对我的代码进行简单的操作,我可以明白你的意思。不过谢谢! 这确实取决于具体情况,但通常您将从磁盘读取文件,这意味着读取操作比您的其他代码慢得多。因此,为了使事情尽可能顺利,批量进行文件访问操作是一种代码优化实践。当然,我说的是除非您处理大量数据,否则甚至不会引起注意的优化,但我想一个好的做法总是好的。

以上是关于将文件读入以逗号和换行符分隔的向量的主要内容,如果未能解决你的问题,请参考以下文章

从用逗号和换行符分隔的文件中读取数组

CSV (逗号分隔值文件格式)

CSV (逗号分隔值文件格式)

vbscript VBA Excel交叉连接和清理数据,每个单元格有多个条目,以逗号或换行符分隔

字符串 CSV解析 表格 逗号分隔值

excel另存为csv打开后有大量逗号是怎么回事?