在ubuntu上使用sqlite3 对csv文件进行操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#include <iostream>
#include <string>
#include <vector>

using namespace std;
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   for(i=0; i < argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
union FloatRand
{
    struct 
    {
        unsigned long Frac:23;
        unsigned long Exp:8;
        unsigned long Signed:1;
    } BitArea;
    float Value;
};
float GetFloatRand()
{
    union FloatRand r;
    r.BitArea.Signed = 0;
    r.BitArea.Exp = 1;
    r.BitArea.Frac = (rand() * rand()) % 0x800000;

    if (r.BitArea.Frac == 0x7FFFFF)
        r.BitArea.Exp = rand() % 0x7E;
    else if (r.BitArea.Frac == 0)
        r.BitArea.Exp = rand() % 0x7E + 1;
    else
        r.BitArea.Exp = rand() % 0x7F;

    return r.Value;
}

class Mysqlite3
{
public:
	Mysqlite3(){};
	~Mysqlite3(){};
public:
	int    open(const char* dbfile);
	int    created();
	string readcsvfile(const char* filename,int len);
	int    from_str_to_vector(std::string& sourceStr,std::vector<float>& vector);
	int    insertToDB_form_csv(const char* csvfile,int floatlen);
private:
	sqlite3 *db;
	char 	*zErrMsg = 0;
	const char* CREATE_TABLE = "create table feat(name VARCHAR(128),num INT,vectors CLOB);";
public:
	inline void   close(){
		sqlite3_close(db);
		std::cout << "sqlite3_close successfully" << std::endl;
	}
};

int Mysqlite3::open(const char* dbfile)
{
	int rc = sqlite3_open(dbfile, &db);
	if(rc){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
    }
    else
    {
      fprintf(stderr, "Opened database successfully\n");
    }
    return  0;
}
int Mysqlite3::created(){
	int rc = sqlite3_exec(db, CREATE_TABLE, callback, 0, &zErrMsg);
   	if( rc != SQLITE_OK ){
   		fprintf(stderr, "SQL error: %s\n", zErrMsg);
      	sqlite3_free(zErrMsg);
   	}
   	else
   	{
      	fprintf(stdout, "Table created successfully\n");
   	}
   	return 0; 
}
string Mysqlite3::readcsvfile(const char* filename,int len)
{
	string out("");
	//std::cout << "str max: " << out.max_size() << std::endl;
	FILE *file = fopen(filename,"r");
	if( file != NULL)
	{
		int    i = 0;
		char   line[64]={0};
		while( (fgets(line,sizeof line,file) != NULL) && (i < len))
		{
			string tt_line = string(line);
			tt_line.erase(tt_line.length()-1,1);

			string t = string(tt_line) + string(",");
			out    += t;

			i++;
		}
		fclose(file);
	}else{
		std::cout << "open file failed" << std::endl;
	}
	//std::cout << "str__ max: " << out << std::endl;
	return out;
}
int Mysqlite3::from_str_to_vector(std::string& sourceStr,std::vector<float>& vector){
	 int     i = 0;
	 int     index  = 0;
	 int     length = 0;
	 char    ff[32]={0};
	
	 int     ok = 0;
	 while(i < sourceStr.length() && (i != std::string::npos)){
	 	if (sourceStr[i] == ',')
	 	{
	 		float t_f = atof(ff);
	 		vector.push_back(t_f);

	 		memset(ff,0,sizeof(ff)/sizeof(char));

	 		index = 0;
	 		ok ++;

	 	}else{
	 		ff[index] = sourceStr[i];
	 		index++;
	 		//std::cout << "data: "<< ff << std::endl;
	 	}
	 	i++;
	 }
	 std::cout  << "ok  num :" << ok << std::endl;
	 return 0;
}

int Mysqlite3::insertToDB_form_csv(const char* csvfile,int floatlen)
{
	string  out = readcsvfile(csvfile,floatlen);
	char    index[2048000]={0};

	sprintf(index,"insert into feat (name,num,vectors) values ('are',%d,'%s');",1,out.c_str());
   	int rc = sqlite3_exec(db, index, callback, 0, &zErrMsg);
   	if( rc != SQLITE_OK ){
   		fprintf(stderr, "SQL error: %s\n", zErrMsg);
      	sqlite3_free(zErrMsg);
   	}
   	else
   	{
       fprintf(stdout, "insertToDB_form_csv successfully\n");
   	} 
   	return 0;
}
int main(int argc, char* argv[])
{
   	Mysqlite3 sq;
   	sq.open("face.db");
   	sq.created();
   	sq.close();
	return 0;   
}
 
以上内容为博主原创,如需转载,请注明出处,谢谢!
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teleger

你的支持是我前进的方向

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值