这可能以前出现过,但我无法理解如何提取格式化数据。下面是我的代码,用于在文本文件中提取字符串“[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
答案 0 :(得分:2)
这实际上取决于“提取数据意味着什么”。在简单的情况下,您只需阅读file into a string,然后使用string成员函数(尤其是find
和substr
)来提取您感兴趣的细分。如果您有兴趣每行数据getline是行提取的方法。像以前一样应用find
和substr
来获取细分。
有时一个简单的find
不会让你走得太远,你需要一个regular expression来轻松找到你感兴趣的部分。
通常简单的解析器会逐渐发展,很快就会超过regular expressions
。这通常标志着C ++解析Boost.Spirit非常大的时间。
答案 1 :(得分:1)
Boost.Tokenizer可以帮助解析出一个字符串,但是如果这些分隔符必须像你拥有它们一样被包括在内,那么它会变得有点棘手。如上所述的分隔符,正则表达式可能就足够了。
答案 2 :(得分:0)
所有这一切都是连接读数的输出和字符串“[1]”和“[2]”。我猜这个代码是由使用scanf
的类似代码的相当字面推断产生的。 scanf
(以及C的其余部分)仍然可以在C ++中使用,所以如果这对您有用,我会使用它。
尽管如此,你可以做到各种各样的复杂程度。使用正则表达式是最强大/最灵活的方法之一,但它可能有点过分。我认为最快的方法就是做一些事情:
i1
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));
警告:没有错误检查。