我使用以下代码搜索文件并提供数据和相关的行号。但是这个代码在成千上万行的情况下是否足够快?我的电脑几乎冻结了几秒钟。我需要搜索整数对并在逗号之后返回其RHS值(一些统计信息),但是使用以下代码我可以返回整行。
split
函数解析返回的数据并获得我的RHS值OR
任何人都可以帮助我实现上述任何一项吗?
这是我的代码:
#include <string>
#include <iostream>
#include <fstream>
int main()
{
std::ifstream file( "index_hyper.txt" ) ;
std::string search_str = "401" ;
std::string line ;
int line_number = 0 ;
while( std::getline( file, line ) )
{
++line_number ;
if( line.find(search_str) != std::string::npos )
std::cout << "line " << line_number << ": " << line << '\n' ;
}
}
以下是我index_hyper.txt
档案的内容:
18,22
20,37
151,61
200,62
156,63
158,64
159,65
153,66
156,67
152,68
154,69
155,56
156,14
157,13
160,122
161,1333
400,455
401,779
402,74
406,71
答案 0 :(得分:1)
您可以使用以下代码完成上述代码的工作:
grep -n "^401," index_hyper.txt
如果您只想输出RHS,您可以:
grep "^401," index_hyper.txt | sed "s/[^,]*,//"
如果您使用的是没有sed,grep,bash等的Windows平台,则可以通过安装cygwin轻松访问unix工具。
答案 1 :(得分:0)
作为一般规则,不要开始破坏字符串 小块(子串)直到你需要。然后开始 准确地说明需要什么:你说的是RHS和LHS,以及 谈谈“根据LHS论证获得RHS值”。所以:你想要吗? 第一个字段的完全匹配,一个子字符串匹配 第一个字段,或整行的子字符串匹配?
无论如何:一旦你有了line
中的一行,就可以轻松完成
将它分成两个字段:
std::string::const_iterator pivot = std::find( line.cbegin(), line.cend(), ',' );
您所做的事情取决于您的标准:
if ( pivot - line.cbegin() == search_str.size() &&
std::equal( line.cbegin(), pivot, search_str.begin() ) ) {
// Exact match on first field...
std::cout << std::string( std::next( pivot ), line.cend() );
}
if ( std::search( line.cbegin(), pivot, search_str.begin(), search_str.end() ) != pivot ) {
// Matches substring in first field...
std::cout << std::string( std::next( pivot ), line.cend() );
}
if ( std::search( line.cbegin(), line.cend(), search_str.begin(), search_str.end() ) != line.cend() ) {
// Matches substring in complete line...
std::cout << std::string( std::next( pivot ), line.end() ); }
}
当然,您需要进行一些额外的错误检查。什么
如果行中没有逗号(例如pivot ==
line.end()
),你应该这样做吗?或者是什么额外的空间
线。 (您的示例看起来像数字。"401"
应该匹配
仅"401"
,或"+401"
?)
在继续之前,你应该仔细说明
对于所有可能的输入,代码应该做什么。 (对于
最可能的输入,当然,答案可能是:
输出一个错误消息,其行号为std::cerr
和
继续。在这种情况下一定要返回EXIT_FAILURE
。)