C++抓取NCBI BioProject数据:根据基因名获取所有Accession号
C++抓取NCBI BioProject数据:根据基因名获取所有Accession号
本文提供了一个完整的C++代码示例,用于根据用户输入的基因名称,从NCBI BioProject数据库中搜索相关项目,并提取所有页面的Accession号,最后将结果保存到txt文件中。
代码功能:
- 接收用户输入的基因名称。2. 使用libcurl库发送HTTP请求到NCBI EUtils API,搜索BioProject数据库。3. 使用jsoncpp库解析返回的JSON格式数据,提取Accession号信息。4. 将所有页面的Accession号写入到txt文件中。
**代码示例:**cpp#include
// 回调函数,用于处理curl返回的数据size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* buffer) { size_t totalSize = size * nmemb; buffer->append((char*)contents, totalSize); return totalSize;}
// 根据基因名字从NCBI搜索并获取结果std::string searchBioProject(const std::string& geneName, int retstart = 0) { std::string url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=bioproject&term=' + geneName + '&retmax=100000&retstart=' + std::to_string(retstart); std::string buffer;
CURL* curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { std::cerr << 'curl_easy_perform() failed: ' << curl_easy_strerror(res) << std::endl; }
curl_easy_cleanup(curl); }
return buffer;}
// 解析JSON数据,提取Accession号std::vectorstd::string extractAccessionNumbers(const std::string& jsonResult) { std::vectorstd::string accessionNumbers;
Json::Value root; Json::Reader reader;
bool parsingSuccessful = reader.parse(jsonResult, root); if (parsingSuccessful) { const Json::Value& idList = root['esearchresult']['idlist']; for (const auto& id : idList) { accessionNumbers.push_back(id.asString()); } } else { std::cerr << 'Failed to parse JSON' << std::endl; }
return accessionNumbers;}
// 将Accession号写入txt文件void writeAccessionNumbersToFile(const std::vectorstd::string& accessionNumbers) { std::ofstream outputFile('accession_numbers.txt'); if (outputFile.is_open()) { for (const auto& accession : accessionNumbers) { outputFile << accession << std::endl; } outputFile.close(); } else { std::cerr << 'Failed to open output file' << std::endl; }}
int main() { std::string geneName; std::cout << 'Enter gene name: '; std::cin >> geneName;
std::vector<std::string> allAccessionNumbers; int retstart = 0; while (true) { std::string searchResult = searchBioProject(geneName, retstart); std::vector<std::string> accessionNumbers = extractAccessionNumbers(searchResult); if (accessionNumbers.empty()) { break; } allAccessionNumbers.insert(allAccessionNumbers.end(), accessionNumbers.begin(), accessionNumbers.end()); retstart += accessionNumbers.size(); }
writeAccessionNumbersToFile(allAccessionNumbers);
std::cout << 'Accession numbers saved to accession_numbers.txt' << std::endl;
return 0
原文地址: https://www.cveoy.top/t/topic/fUdw 著作权归作者所有。请勿转载和采集!