C++抓取NCBI BioProject数据:根据基因名获取所有Accession号

本文提供了一个完整的C++代码示例,用于根据用户输入的基因名称,从NCBI BioProject数据库中搜索相关项目,并提取所有页面的Accession号,最后将结果保存到txt文件中。

代码功能:

  1. 接收用户输入的基因名称。2. 使用libcurl库发送HTTP请求到NCBI EUtils API,搜索BioProject数据库。3. 使用jsoncpp库解析返回的JSON格式数据,提取Accession号信息。4. 将所有页面的Accession号写入到txt文件中。

**代码示例:**cpp#include #include #include <curl/curl.h>#include <json/json.h>

// 回调函数,用于处理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
C++抓取NCBI BioProject数据:根据基因名获取所有Accession号

原文地址: https://www.cveoy.top/t/topic/fUdw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录