【问题标题】:How to extract formatted text in C++?如何在 C++ 中提取格式化文本?
【发布时间】:2012-07-24 16:22:59
【问题描述】:

这可能以前出现过,但我不明白如何提取格式化数据。下面是我提取文本文件中字符串“[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

标题:货币

      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

【问题讨论】:

  • 您可能会喜欢my older answer,它使用 Boost 格式输出
  • 我写了一个非常笼统的答案,应该会让你朝着正确的方向前进。如果您可以添加实际的文件格式,我可以更具体。
  • 我已经更新了要提取内容的文本文件。看来 getline 是一个可能的解决方案。

标签: c++ text formatted


【解决方案1】:

这实际上取决于“提取数据的含义”。在简单的情况下,您可以只读取file into a string,然后使用string 成员函数(尤其是find 和substr)来提取您感兴趣的段。如果您对每行的数据感兴趣getline 是线提取的方法。像以前一样应用find 和substr 以获取细分。

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

简单的解析器通常会发展并很快超越regular expressions。这通常标志着非常大的 C++ 解析锤Boost.Spirit 的时间。

【讨论】:

    【解决方案2】:

    Boost.Tokenizer 有助于解析字符串,但如果这些分隔符必须像您拥有的那样用括号括起来,那就有点棘手了。使用所描述的分隔符,正则表达式可能就足够了。

    【讨论】:

      【解决方案3】:

      所做的只是将读取的输出与字符串“[1]”和“[2]”连接起来。我猜这段代码是由使用scanf 对类似代码的相当字面推断得出的。 scanf(以及 C 的其余部分)仍然在 C++ 中工作,所以如果这对你有用,我会使用它。

      也就是说,您可以通过各种复杂程度来执行此操作。使用正则表达式是最强大/最灵活的方法之一,但它可能有点矫枉过正。我认为最快的方法就是执行以下操作:

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

      在代码中,假设std::string line 有文本:

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

      警告:没有错误检查。

      【讨论】:

      • 对,如上图我已经做到了。但是2 size_t的返回位置是一样的!我们如何解决这个问题?谢谢!
      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多