由于经常要读取大量的数据进行分析,自己封装了一个C++的类,代替网上的rapidcsv库。一切以自己的需求为准,够用简略就好。真正体会到了C++程序员造轮子的乐趣。自己的拼装车就是好用。
文章需要的csv、xls数据文件,大家可以自己从网上下载:
1、网易财经频道可以下载到csv格式的股票日线数据,可以试着用我的quickcsv库读取
2、同花顺股票软件也可以导出xls格式的excel文件,也可以用我的库来读取。
所以,本文就不附加下载内容了,自己找材料测试
今天废话真多,好了,上代码:
QuickCsv.h头文件

#pragma once
#ifndef QUICKCSV_H
#define QUICKCSV_H
#include<vector>
#include<iostream>
#include <fstream>
#include <sstream>
#include<assert.h>using namespace std;class QuickCsv
{public://QuickCsv(std::string Path):mPath(Path)//{//    ReadCsvData(mPath);//}QuickCsv(){}~QuickCsv(){VectorCsvOfAllLines.clear();}/*初始化数据,现在使用初始化函数可以保证一个类对象实例可以调用不同的市场数据*/void InitData(std::string Path){mPath = Path;VectorCsvOfAllLines.clear();//mPath.assign(Path);   //文件路径决定了计算哪个市场的数据//定义为私有函数、放在构造函数里面,更有面向对象编程的意味:实例化一个类对象,就对应一个csv文件的处理ReadCsvData(Path);}/*写入一行csv文件Mode(方式) 意义"r"     打开一个用于读取的文本文件"w"      创建一个用于写入的文本文件"a"      附加到一个文本文件"rb" 打开一个用于读取的二进制文件"wb"    创建一个用于写入的二进制文件"ab"    附加到一个二进制文件"r+"   打开一个用于读/写的文本文件"w+"   创建一个用于读/写的文本文件"a+"   打开一个用于读/写的文本文件"rb+"  打开一个用于读/写的二进制文件"wb+" 创建一个用于读/写的二进制文件"ab+" 打开一个用于读/写的二进制文件*/void WriteInDataToCsv(std::string Path, std::string VectorDataLine, const char* Mode)//写csv文件,保存文件{FILE* mFile;fopen_s(&mFile, Path.c_str(), Mode);if (!mFile){printf_s("文件不存在,打开失败!!!");return;}fprintf_s(mFile, VectorDataLine.c_str());fflush(mFile);fclose(mFile);}/*重载,写入一行csv文件*/void WriteInDataToCsv(std::string Path, std::vector<std::string>VectorDataLine, const char* Mode)//写csv文件,保存文件{FILE* mFile;fopen_s(&mFile, Path.c_str(), Mode);if (!mFile){printf_s("文件不存在,打开失败!!!");return;}for (auto itr = VectorDataLine.begin(); itr != VectorDataLine.end(); ++itr){if (itr == VectorDataLine.end() - 1){fprintf_s(mFile, "%s\0", itr->c_str());fflush(mFile);}else{fprintf_s(mFile, "%s\t", itr->c_str());fflush(mFile);}}fclose(mFile);}/*重载,写入多行csv文件*/void WriteInDataToCsv(std::string Path, std::vector<std::vector<std::string>>VectorDataLine, const char* Mode)//写csv文件,保存文件{FILE* mFile;fopen_s(&mFile, Path.c_str(), Mode);if (!mFile){printf_s("文件不存在,打开失败!!!");return;}for (auto itr = VectorDataLine.begin(); itr != VectorDataLine.end(); ++itr){//从itr->begin()到itr->end()是一系列string类型的数据(一行)for (auto data_itr = itr->begin(); data_itr != itr->end(); ++data_itr){if (data_itr == itr->end() - 1){fprintf_s(mFile, "%s\0", data_itr->c_str());fflush(mFile);}else{fprintf_s(mFile, "%s\t", data_itr->c_str());fflush(mFile);}}}fclose(mFile);}void DeletRow(int RowID)//删除行{//(一)先操作内存数据for (int i = 0; i < VectorCsvOfAllLines.size(); i++){if (i == RowID)//要删除的行,忽略掉{continue;}TmpVectorCsvOfAllLines.push_back(VectorCsvOfAllLines.at(i));//其余的内容保留在临时的vector里面}VectorCsvOfAllLines.swap(TmpVectorCsvOfAllLines);               //用临时的vector交换原来的VectorCsvOfAllLines数据,实现修改的目的TmpVectorCsvOfAllLines.clear();                                    //清空临时的vector//(2)接下来写入本地文件WriteInDataToCsv(mPath, VectorCsvOfAllLines, "w");}void DeleteColumn(int ColumnID)//删除列{std::vector<std::string>tmpLine;//临时的行//(一)先操作内存数据for (auto itr = VectorCsvOfAllLines.begin(); itr!=  VectorCsvOfAllLines.end(); ++itr){int num = 0;for (auto lineitr = itr->begin(); lineitr != itr->end();++lineitr)//itr就是每一行数据,遍历每一行{if (num == ColumnID)//如果遇到我们要删除的列,跳过{continue;}else//否则就把每一行不准备删除的数据保留在tmpLine里面{tmpLine.push_back(*lineitr);}num++;}TmpVectorCsvOfAllLines.push_back(tmpLine);//其余的内容保留在临时的vector里面tmpLine.clear();//每次循环处理一行数据,用完清理一次}VectorCsvOfAllLines.swap(TmpVectorCsvOfAllLines);               //用临时的vector交换原来的VectorCsvOfAllLines数据,实现修改的目的TmpVectorCsvOfAllLines.clear();                                    //清空临时的vector//(2)接下来写入本地文件WriteInDataToCsv(mPath, VectorCsvOfAllLines, "w");}void InsertRow(int RowID,std::vector<std::string>myLine)//插入行{//(1)先操作内存数据std::vector<std::vector<std::string>>::iterator myitr;//找到第RowID行的迭代器int num = 0;for (auto itr = VectorCsvOfAllLines.begin(); itr != VectorCsvOfAllLines.end(); ++itr){if (num == RowID){myitr = itr --;//num++是前一次循环break;}else{num++;}}VectorCsvOfAllLines.insert(myitr, myLine);//(2)接下来写入本地文件WriteInDataToCsv(mPath, VectorCsvOfAllLines, "w");}void InsertColumn(int ColumnID,std::vector<std::string>myColumData)//插入列{std::vector<std::string>tmpLine;//临时的行//(1)先操作内存数据int RowID = 0;for (auto itr = VectorCsvOfAllLines.begin(); itr != VectorCsvOfAllLines.end(); ++itr){RowID++;tmpLine = *itr;//把一行的数据保存在临时行里面std::vector<std::string>::iterator myitr= GetIteratorByID(ColumnID, tmpLine);//找到每一行第ColumnID列的迭代器if (RowID < myColumData.size()){tmpLine.insert(myitr, myColumData.at(RowID));//此处有风险:有可能使用者给的列数据myColumData不够多,导致内存溢出TmpVectorCsvOfAllLines.push_back(tmpLine);//其余的内容保留在临时的vector里面}tmpLine.clear();//每次循环处理一行数据,用完清理一次}VectorCsvOfAllLines.swap(TmpVectorCsvOfAllLines);             //用临时的vector交换原来的VectorCsvOfAllLines数据,实现修改的目的TmpVectorCsvOfAllLines.clear();                                    //清空临时的vector//(2)接下来写入本地文件WriteInDataToCsv(mPath, VectorCsvOfAllLines, "w");}/*功能:获取第ColumID列的所有内容,比如股票代码、名称、换手率等等也可以获取所有的行名称,即所谓第0列参数:int ColumID:     列的序号bool GetHeader:  为真,保留列头(第0行);为假,只保留数据,没有表头项*/std::vector<std::string> GetColumStrings(int ColumID, bool GetHeader){std::vector<std::string> VectorCsvRowNames;//保存行名称数据std::string tmpStr;for (auto itr = VectorCsvOfAllLines.begin(); itr != VectorCsvOfAllLines.end(); ++itr){tmpStr = itr->at(ColumID);//tmpStr.erase(0, 2);VectorCsvRowNames.push_back(tmpStr);tmpStr.clear();}if (!GetHeader){VectorCsvRowNames.erase(VectorCsvRowNames.begin());}return VectorCsvRowNames;}/*功能:同时获取若干列的所有内容,比如同时获取股票代码、名称、换手率、市盈率等等,方便以后提取数据参数:int ColumID:     列的序号bool GetHeader:  为真,保留列头(第0行);为假,只保留数据,没有表头项*/std::vector<std::vector<std::string>> GetColumsStrings(std::vector<int> ColumIDs, bool GetHeader){std::vector<std::vector<std::string>> VectorCsvRowNames;//保存行名称数据if (VectorCsvOfAllLines.size() == 0){std::cout << "类内部GetColumsStrings函数调用时VectorCsvOfAllLines没有数据:" << std::endl;return VectorCsvRowNames;//空的,刚刚定义的}std::vector<std::string>oneLine;for (auto itr = VectorCsvOfAllLines.begin(); itr != VectorCsvOfAllLines.end(); ++itr)//一大行数据{for (size_t i = 0; i < ColumIDs.size(); i++)//生成的一小行数据0、1、4、8{//cout << "itr->at(*int_itr)=" << itr->at(*int_itr) << "\n" << endl;//itr代表VectorCsvOfAllLines中的一行数据,这是一个vector;//现在只按照ColumIDs提取*int_itr这几项:itr->at(0)、itr->at(3)、itr->at(4)、itr->at(8)等等oneLine.push_back(itr->at(ColumIDs[i]));//把提取出来的这几项放入oneLine组成新的一行数据}VectorCsvRowNames.push_back(oneLine);//把新生成的一行数据oneLine放入VectorCsvRowNamesoneLine.clear();}if (!GetHeader){VectorCsvRowNames.erase(VectorCsvRowNames.begin());}return VectorCsvRowNames;}//获取csv文件数据的列表表头,std::vector<std::string> GetHeaders()//读取和处理一行csv数据{//vector<std::string>VectorCsvHeader;//ifstream inFile(mPath.c_str(), ios::in); //声明一个ifstream对象,与文件名关联mPath已经构造函数传参//string HeaderLineStr;//getline(inFile, HeaderLineStr);//不放在while循环里只读取第一行,csv文件的数据表头//istringstream sin(HeaderLineStr);         //将整行字符串lineStr读入到字符串流istringstream中//string headerDatas;把字符串行HeaderLineStr按照字符“,”分割为每一“行”(实际上就是数据块)每一个数据块(字符“,"分割的)放入headerDatas//while (getline(sin, headerDatas, mch))//{//   VectorCsvHeader.push_back(Trim(headerDatas));// headerDatas.clear();//}//HeaderLineStr.clear();//return VectorCsvHeader;return VectorCsvOfAllLines.at(0);}/*功能:获取第RowID行的数据参数:int RowID:               行的序号bool IsRowName:      为真,有行名称;(行的第0项为行名称,不是要计算、比较的数据)为假,无行名称(行的第0项为直接是数据,比如服务器得到的API数据,自己需要按照约定规则的处理),只保留数据bool IsHeader         为真,存在列头(第0行不是数据);为假,第0行直接是数据,只保留数据,没有表头项是否存在表头有的数据列表没有标头,第0行直接是数据,比如服务器得到的API数据,自己需要按照约定规则的处理*/std::vector<double>GetRowData(int RowID, bool IsRowName, bool IsHeader){if (IsHeader)//为真,存在列头(第0行不是数据);{RowID += 1;}//需要判断RowID是否为第0行,有的数据列表没有标头,第0行直接是数据,比如服务器得到的API数据,自己需要按照约定规则的处理std::vector<double> VectorCsvRowDatas;//保存行数据std::vector<std::string> VectormyLine = VectorCsvOfAllLines.at(RowID);//得到第RowID行if (IsRowName)//为真,有行名称;(行的第0项为行名称,不是要计算、比较的数据){for (auto itr = VectormyLine.begin() + 1; itr != VectormyLine.end(); ++itr){VectorCsvRowDatas.push_back(StringToDouble(*itr));//printf_s("%s\n",itr->at(0).c_str());}}else//为假,无行名称(行的第0项直接就是数据,比如服务器得到的API数据,自己需要按照约定规则的处理){for (auto itr = VectormyLine.begin(); itr != VectormyLine.end(); ++itr){VectorCsvRowDatas.push_back(StringToDouble(*itr));//printf_s("%s\n",itr->at(0).c_str());}}return VectorCsvRowDatas;}/*功能:(函数重载)获取第RowID行的数据参数:int RowID:             行的序号bool IsRowName:      为真,有行名称;(行的第0项为行名称,不是要计算、比较的数据)为假,无行名称(行的第0项为直接是数据,比如服务器得到的API数据,自己需要按照约定规则的处理),只保留数据bool IsHeader         为真,存在列头(第0行不是数据);为假,第0行直接是数据,只保留数据,没有表头项是否存在表头有的数据列表没有标头,第0行直接是数据,比如服务器得到的API数据,自己需要按照约定规则的处理*/std::vector<double>GetRowData(int RowID, std::vector<int>ColumsID, bool IsHeader){if (IsHeader)//为真,存在列头(第0行不是数据);{RowID += 1;}//需要判断RowID是否为第0行,有的数据列表没有标头,第0行直接是数据,比如服务器得到的API数据,自己需要按照约定规则的处理std::vector<double> VectorCsvRowDatas;//保存行数据std::vector<std::string> VectormyLine = VectorCsvOfAllLines.at(RowID);//得到第RowID行for (auto int_itr = ColumsID.begin(); int_itr != ColumsID.end(); ++int_itr){//cout <<"看看  *int_itr的值:"<< * int_itr << endl;VectorCsvRowDatas.push_back(StringToDouble(VectormyLine[*int_itr]));}return VectorCsvRowDatas;}
private:/*从MyVector里面获取第DataID项的迭代器*/std::vector<std::string>::iterator GetIteratorByID(int DataID, std::vector<std::string>MyVector)//找到每一行第ColumnID列的迭代器{std::vector<std::string>::iterator myitr;//找到每一行第ColumnID列的迭代器int num = 0;for (auto lineitr = MyVector.begin(); lineitr != MyVector.end(); ++lineitr)//tmpLine就是每一行数据,遍历每一行{if (num == DataID)//如果遇到我们要添加的列,记录下来迭代器{myitr = lineitr;break;}else//否则就跳过{num++;}}return myitr;}//定义为私有函数、放在构造函数里面,更有面向对象编程的意味:实例化一个类对象,就对应一个csv文件的处理void ReadCsvData(std::string Path)//读取csv文件{FILE* mFile;fopen_s(&mFile, Path.c_str(), "r");if (!mFile){printf_s("文件%s不存在、或者文件名、文件路径有误,文件打开失败!!!\n", Path.c_str());return;}fclose(mFile);/*getline()函数用于输入流,读取字符到buffer中,直到下列情况发生:num - 1个字符已经读入,碰到一个换行标志,碰到一个EOF,或者,任意地读入,直到读到字符delim。delim字符不会被放入buffer中。*/std::ifstream fin(Path.c_str()); //打开文件流操作,构造函数传参std::string line;getline(fin, line);//先判断是什么类型的数据文件if (line.find(',') != std::string::npos)//存在分隔符“,”{VectorCsvOfAllLines.push_back(ParseLineStringToVector(line, ','));//别把文件中的第一行给忘掉了//把mPath文件按行整行读取,读取到行line当中,这个行是我们人类所理解的行,以换行符“\n”结束。//遇到文件尾标志eof终止读取,结束while循环while (getline(fin, line)){//csv文件某一行数据项std::vector<std::string> VectorCsvDataOfOneLine = ParseLineStringToVector(line, ',');VectorCsvOfAllLines.push_back(VectorCsvDataOfOneLine);VectorCsvDataOfOneLine.clear();//strtod函数也可以实现string到double的转换}}else if (line.find('\t') != std::string::npos)//存在空格“tab”为分隔符{VectorCsvOfAllLines.push_back(ParseLineStringToVector(line, '\t'));//别把文件中的第一行给忘掉了//把mPath文件按行整行读取,读取到行line当中,这个行是我们人类所理解的行,以换行符“\n”结束。//遇到文件尾标志eof终止读取,结束while循环while (getline(fin, line)){//csv文件某一行数据项std::vector<std::string> VectorCsvDataOfOneLine = ParseLineStringToVector(line, '\t');VectorCsvOfAllLines.push_back(VectorCsvDataOfOneLine);VectorCsvDataOfOneLine.clear();//strtod函数也可以实现string到double的转换}}else//既不存在“,”也不存在“\t”符{while (getline(fin, line)){//csv文件某一行数据项std::vector<std::string> VectorCsvDataOfOneLine;VectorCsvDataOfOneLine.push_back(line);VectorCsvOfAllLines.push_back(VectorCsvDataOfOneLine);VectorCsvDataOfOneLine.clear();//strtod函数也可以实现string到double的转换}}//看看结果//cout << "ReadCsvData函数运算结束,VectorCsvOfAllLines里面有:"<< VectorCsvOfAllLines.size()<<"行数据\n" << endl;}//按照某个特殊的字符ch切割每一行数据,放在vector<std::string> 里面std::vector<std::string> ParseLineStringToVector(std::string LineStr, char ch){std::istringstream sin(LineStr);         //将整行字符串line读入到字符串流istringstream中std::string StrOfOneLine;std::vector<std::string> VectorLineStr;//csv文件某一行数据项//sin(line)是从文件中读取的一行的数据(回车结束的自然行);//StrOfOneLine是从sin(line)中读取一行一行的数据(实际上是数据块),每“行”以字符“,"为分隔符;//每“行”字符串(数据块)StrOfOneLine又放入vector当中。while (getline(sin, StrOfOneLine, ch)){VectorLineStr.push_back(Trim(StrOfOneLine));     //将刚刚读取的每一行的数据块字符串添加到vector中LineStr.clear();//看看是否有必要}return VectorLineStr;//strtod函数也可以实现string到double的转换}//整理数据std::string Trim(std::string& str){str.find_first_not_of(" \t\r\n");// 在字符串str中从索引0开始,返回首次不匹配"\t\r\n"的位置str.erase(0, str.find_first_not_of(" \t\r\n"));str.erase(str.find_last_not_of(" \t\r\n") + 1);return str;}/*C++实现atof()--string to double的转化*/double StringToDouble(std::string str){assert(str.size() != NULL);//断言非常重要,发现bug//if(str.size() == NULL);//断言非常重要,发现bug//{//  str = "00";//}int i = 0;double dou_num = 0;double t = 10;bool fh_ = false;if (str[i] == '-'){fh_ = true;i++;}while (str[i] != '\0')//不是换行符,数据结束符{if (str[i] == '.')//找到小数点就移位到下一个字符{i++;//移位到下一个字符break;}dou_num = dou_num * 10 + str[i] - '0';i++;}while (str[i] != '\0'){dou_num = dou_num + ((double)str[i] - '0') / t;t *= 10;i++;}if (fh_)return -1.0 * dou_num;elsereturn dou_num;}
private://对于修改操作必须把结果写入本地文件,所以必须要保存文件名和文件路径std::string mPath;//csv文件的路径,初始化函数传参std::vector<std::vector<std::string>> VectorCsvOfAllLines;//所有的行,包括列表表头、行名称std::vector<std::vector<std::string>> TmpVectorCsvOfAllLines;//修改数据时需要的临时变量;所有的行,包括列表表头、行名称int ColumnNum = 0;//csv文件数据的列数,根据表头计算出来
};#endif // !QUICKCSV_H

调用QuickCsv类的cpp文件

#include"QuickCsv.h"
QuickCsv qc("../shanghai_a.xls");
//QuickCsv qc("../DaLian.csv");int main()
{//调用GetRowNames()函数//vector<std::string> VectorCsvRowNames=qc.GetColumStrings(0,1);//参数为真,把列的表头一项也加进来//int i = 0;//for (auto itr = VectorCsvRowNames.begin(); itr != VectorCsvRowNames.end(); ++itr)//{//   printf_s("沪市有%d只股票,第%d只股票代码:%s\n", VectorCsvRowNames.size(), i, itr->c_str());// i++;//}//VectorCsvRowNames.clear();//调用GetRowData()函数(一)int RowNum =6;//vector<double>mRow = qc.GetRowData(RowNum, 1, 1);//第0行的数据//for (auto itr = mRow.begin(); itr != mRow.end(); ++itr)//{// printf_s("调用GetRowData()函数(一):第%d行有%d项数据:%.5f\n", RowNum, mRow.size(), *itr);//}//mRow.clear();调用GetRowData()函数(二)重载//vector<int> myColumsID = {3,4, 5 };//我只获取第RowNum行--第2、3、4、5列的数据//vector<double>mRow2 = qc.GetRowData(RowNum, myColumsID, 1);//第0行的数据//for (auto itr = mRow2.begin(); itr != mRow2.end(); ++itr)//{//    printf_s("重载调用GetRowData()函数:第%d行有%d项数据:%.5f\n", RowNum, mRow2.size(), *itr);//}//mRow2.clear();            //先进后出//myColumsID.clear();     //先进后出//调用GetHeaders()函数//vector<std::string>VectorCsvHeader=qc.GetHeaders();//看看效果://int i = 0;//for (auto itr = VectorCsvHeader.begin(); itr != VectorCsvHeader.end(); ++itr)//{// printf_s("csv文件有%d列;第%d列表头:%s\n", VectorCsvHeader.size(), i, itr->c_str());//    i++;//}//VectorCsvHeader.clear();vector<int>myColums = { 0,1,4,7 };//代码、名称、换手率、流通比vector<vector<string>> myVector=qc.GetColumsStrings(myColums,1);int i = 0;for (auto itr = myVector.begin(); itr != myVector.end(); ++itr){if (i > 50)break;//通过itr得到了每一个数据行for (auto mitr = itr->begin(); mitr != itr->end(); ++mitr){if (mitr != itr->end() - 1){printf_s("%s---", mitr->c_str());}else{printf_s("%s\n", mitr->c_str());}}i++;}myColums.clear();//先进后出myVector.clear();//先进后出getchar();qc.~QuickCsv();return 0;
}

效果图:

C++读取读取csv、xls文件的类相关推荐

  1. 05pandas读取excel csv txt文件

    pandas丨数据读取与保存 读取excel文件: pandas.read_excel() 保存excel文件: pandas.to_excel() pandas.read_excel(io, she ...

  2. R语言读取 xlsx 和xls 文件

    前言: 今天我用openxlsx包中的read.xlsx读取xls文件时,竟然报错了.我记得有一个包是可以读取Excel2003的,搜索了一下,发现不太容易查找,就写一遍博客记录一下.毕竟,很多东西放 ...

  3. CSV XLS文件区别

    xls 文件就是Microsoft excel电子表格的文件格式.我想就不用多介绍了吧,学校里多少都学过的. CSV是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中. 此文件,一行 ...

  4. C# 读取Excel CSV 类型文件到DataSet中,反之从DataSet写入excel

    /// <summary> /// 设置文件保存位置, /// </summary> /// <returns>返回文件路径</returns> pri ...

  5. Python编程之读取Excel csv格式文件内容

    1.读取csv文件,返回list数据结构 注意:csv文件中不应该出现合并行的数据,否则读取为空值 test.csv文件为:可以自己定义 2.程序部分 import sys import csv de ...

  6. oledbconnection java_如何使用C#和OleDbConnection读取.xlsx和.xls文件?

    以前我使用 ExcelPackage 从.xlsx文件中读取数据 . 这工作正常但后来我意识到 ExcelPackage 不适用于旧的.xls格式 . 所以我升级为使用 OleDbConnection ...

  7. java 读取txt文件和xls文件

    ①:java读取txt文件 首先声明一下,我此处所涉及的文件读取只是简单的读取以及自己的一些见解.如有错误,还请提点 package test;import java.io.BufferedReade ...

  8. 【用JS自制表格软件玩数据】2.读取 xls 文件

    读写Excel Excel文档的包结构 Excel文档的组织形式 Content Types 主要内容(worksheet) 关联(Relationships) 第三方库 SheetJS 工作原理介绍 ...

  9. Pandas读csv,xlsx,XLS文件,读代表名的文件

    Pandas读文件 1.读取csv文件 2.读取xlsx,XLS文件 1.读取csv文件 读csv文件用pandas.read_csv() 这里要注意的是 " \ " 和" ...

  10. php如何导入大文件数据库,PHP读取CSV大文件导入数据库的示例

    文章详细介绍了csv文件在php中快速导入到mysql数据库中的例子,虽然从最简单的几百MB的到最后使用插件实现几个GB数据导入中间有一些嗑碰了,但结果还是好的. 对于数百万条数据量的CSV文件,文件 ...

最新文章

  1. 正则表达式的常用操作符
  2. TensorFlow——加载和使用多个模型解决方案
  3. java 信号量 countdown_Java计数器之CountDownLatch、CyclicBarrier、Semaphore
  4. 腾讯云发布专有云TCE矩阵,让企业用上金融级合规专有云
  5. DistCp迁移Hive数据过程中源集群增加删除文件等场景测试
  6. oracle杀死进程时权限不足_在oracle中创建函数时权限不足
  7. 图像增强_Keras 常用的图像增强方式
  8. 年薪 50w+ 的程序员,是这样写代码的?
  9. 编写脚本常用的几种语句
  10. php有重载函数吗,PHP: 重载 - Manual
  11. mysql查询数据1168_mysqldump 1168 error
  12. 卡耐基计算机专业课程,你以为卡耐基梅隆大学只有计算机专业厉害吗?
  13. iPad 生产力指南:如何把MathType7安装在iPad中,方便写公式,写论文,公式编辑器,完全免费
  14. nodejs常用模块async(waterfall,each,eachSeries,whilst)
  15. Javaweb分页技术实现
  16. 《禅与摩托车维修艺术》读后感第一篇
  17. 大型传统企业的数字化创新之路
  18. python获取股票历史数据
  19. html实战:用html编写游戏
  20. 百度网盘无法登陆,二维码不显示,密码、验证码登陆显示‘网络异常’解决方法

热门文章

  1. 回声消除(AEC)初体验之matlab仿真
  2. 企业邮箱被反垃圾邮件联盟封了的方法
  3. 360与腾讯之争之厚黑学分析
  4. Unity3D射击游戏的准心
  5. mysql系统找不到指定文件_mysql安装常见问题(系统找不到指定的文件、发生系统错误......
  6. Pandas快乐学习之上海机动车牌照拍卖
  7. [BZOJ4152][AMPPZ2014]The Captain题解
  8. python接入支付宝 40004 invalid-signature 错误原因: 验签出错
  9. github 443问题
  10. MovieClip序列帧动画 视频教程