如何在C ++中提取格式化文本?

时间:2012-07-24 16:23:00

标签: c++ text formatted

这可能以前出现过,但我无法理解如何提取格式化数据。下面是我的代码,用于在文本文件中提取字符串“[87]”和“[90]”之间的所有文本。

显然,[87]和[90]的位置与输出中的位置相同。

void ExtractWebContent::filterContent(){
    string str, str1;
    string positionOfCurrency1 = "[87]";
    string positionOfCurrency2 = "[90]";
    size_t positionOfText1, positionOfText2;
    ifstream reading;
    reading.open("file_Currency.txt");
    while (!reading.eof()){ 
        getline (reading, str);

        positionOfText1 = str.find(positionOfCurrency1);
        positionOfText2 = str.find(positionOfCurrency2);
        cout << "positionOfCurrency1 " << positionOfText1 << endl;
        cout << "positionOfCurrency2 " << positionOfText2 << endl;

        //str1= str.substr (positionOfText);
        cout << "String" << str1 << endl;
    }

    reading.close(); 

货币档案的更新:

[79]更多»由于对欧元区经济的担忧,布伦特原油价跌至102美元

市场数据

 * Currencies

CAPTION:货币

      Name      Price    Change % Chg
   [80]USD/SGD
              1.2606     -0.00  -0.13%

                                       USD/SGD [81]USDSGD=X
   [82]EUR/SGD
              1.5242     0.00   +0.11%

                                       EUR/SGD [83]EURSGD=X

3 个答案:

答案 0 :(得分:2)

这实际上取决于“提取数据意味着什么”。在简单的情况下,您只需阅读file into a string,然后使用string成员函数(尤其是findsubstr)来提取您感兴趣的细分。如果您有兴趣每行数据getline是行提取的方法。像以前一样应用findsubstr来获取细分。

有时一个简单的find不会让你走得太远,你需要一个regular expression来轻松找到你感兴趣的部分。

通常简单的解析器会逐渐发展,很快就会超过regular expressions。这通常标志着C ++解析Boost.Spirit非常大的时间。

答案 1 :(得分:1)

Boost.Tokenizer可以帮助解析出一个字符串,但是如果这些分隔符必须像你拥有它们一样被包括在内,那么它会变得有点棘手。如上所述的分隔符,正则表达式可能就足够了。

答案 2 :(得分:0)

所有这一切都是连接读数的输出和字符串“[1]”和“[2]”。我猜这个代码是由使用scanf的类似代码的相当字面推断产生的。 scanf(以及C的其余部分)仍然可以在C ++中使用,所以如果这对您有用,我会使用它。

尽管如此,你可以做到各种各样的复杂程度。使用正则表达式是最强大/最灵活的方法之一,但它可能有点过分。我认为最快的方法就是做一些事情:

  • 查找子串“[1]”,i1
  • 的索引
  • 查找子串“[2]”,i2
  • 的索引
  • 获取i1+3i2之间的子字符串。

在代码中,假设std::string line包含文字:

size_t i1 = line.find("[1]");
size_t i2 = line.find("[2]");
std::string out(line.substr(i1+3, i2));

警告:没有错误检查。