1

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

3 回答 3

2

这实际上取决于“提取数据的含义”。在简单的情况下,您可以将文件读入字符串,然后使用字符串成员函数(尤其是findand substr)来提取您感兴趣的段。如果您对每行数据感兴趣,getline是行提取的方法。像以前一样应用findsubstr获取细分。

有时一个简单的方法find不会让你走得更远,你需要一个正则表达式来轻松找到你感兴趣的部分。

简单的解析器通常会不断发展,甚至很快就会过时regular expressions。这通常标志着 C++ 解析Boost.Spirit的巨大锤子的时间。

于 2012-07-25T00:00:53.063 回答
1

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

于 2012-07-25T00:06:13.577 回答
0

所做的只是连接读取的输出和字符串“[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));

警告:没有错误检查。

于 2012-07-25T00:01:34.943 回答