如何从txt文件中提取数据,该文件由|分隔

时间:2013-11-30 08:43:41

标签: c++

我正在寻找一种从txt文件中提取数据的方法,该数据按行分开,每列数据由|

分隔

这是一个例子

12|john bravo|123 kings street
15|marry jane|321 kings street

以前我是通过使用像这样的空格分开来做到的。

12 john kingstreet
15 marry kingstreet

但是当我在姓名中添加姓氏/添加带空格的地址时会出现问题,例如:john bravo 所以我决定使用|

分离列数据

这是我提取数据的方式

struct PERSON{
   int id;
   string name;
   string address;
};

//extract
int main(){
   PERSON data[2];

   ifstream uFile("people.txt");
   int i = 0;
   while(uFile >> data[i].id >> data[i].name >> data[i].address){
    i++;
   }
   return 0;
}

那么如果用|分隔列,我该如何提取? ??

3 个答案:

答案 0 :(得分:4)

使用getline()两次: 首先,让每一行使用默认的分隔符(新行);第二,对于第一步中的每个段,使用“|”作为分隔符。 “stringstream”类可用于传输数据。


@edward下面的代码是从你的代码修改的,我认为@ P0W58的答案更好。

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

const int length = 2;

struct PERSON
{
    int id;
    string name;
    string address;
};

//extract
int main()
{
    PERSON data[length];

    ifstream fin("people.txt");

    int i = 0;
    while(true)
    {
        string segment;
        if (!getline(fin, segment))
            break;

        stringstream transporter;
        transporter << segment;

        string idString;
        getline(transporter, idString, '|');
        getline(transporter, data[i].name, '|');
        getline(transporter, data[i].address, '|');

        stringstream idStream;
        idStream << idString;

        idStream >> data[i].id;

        i++;
    }

    for (i=0; i<length; i++)
        cout << data[i].id << '+' << data[i].name << '+'\
            << data[i].address << endl;

    return 0;
}

答案 1 :(得分:2)

要阅读struct,我会重载<<,然后解析其中一个答案中提到的文字。

这样的事情:

#include<sstream>
//...

struct PERSON{
   int id;
   std::string name;
   std::string address;

   friend std::istream& operator >>(std::istream& is, PERSON& p)
   {
     std::string s;
     std::getline(is, s); //Read Line, use '\r' if your file is saved on linux
     std::stringstream ss(s);
     std::getline(ss, s, '|');  //id
     p.id = std::atoi(s.c_str()); 
     std::getline(ss, p.name, '|'); // name
     std::getline(ss, p.address, '|'); //address

    return is ;
   }
};

然后你可能会这样做,

std::ifstream fin("input.txt");
PERSON p1;
while (fin >> p1)
   //std::cout << p1.id << p1.name << std::endl ; 

您也可以重载<<

答案 2 :(得分:0)

使用boost :: tokenizer或首先找到like:

// code example
string s = "12|john bravo|123 kings street";
string delimiters = "|";
size_t current;
size_t next = -1;
do
{
  current = next + 1;
  next = s.find_first_of( delimiters, current );
  cout << s.substr( current, next - current ) << endl;
}
while (next != string::npos);