大概20000多条数据写入csv格式文件速度太慢,怎么办?

lvjack 2003-03-20 04:17:36
用以下循环写入,strGen 是AnsiString,Query是ADODataSet

for ( int i=0; i < Query->RecordCount;i++)
{
for(int j=0;j<Query->FieldCount;j++)
{
strGen=strGen + Query->Fields->Fields[j]->AsString + ",";
}
Query->Next();
Application->ProcessMessages();
//SBar1->SimpleText="写入第 " + IntToStr(i) + " 条数据";
strGen=strGen + "\r\n" ;
}
写1000多条数据用了9秒,写20000多条数据时等了7分钟还没完,等不及将进程杀掉了,各位有什么好的办法么?
...全文
1046 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvjack 2003-03-21
  • 打赏
  • 举报
回复
UTL是什么?
用Oracle存储过程能实现数据写入csv格式文件么?

不好意思,不懂的太多
勉励前行 2003-03-21
  • 打赏
  • 举报
回复
20000多条数据,我看要不了5秒。
勉励前行 2003-03-21
  • 打赏
  • 举报
回复
下面是某個類中的一個方法,可參考一下。
bool TXT_FixSeparator::SaveToFile(const char *FileName,TDataSet *DataSet)
//CSV OutPut
{FILE *fstream = fopen(FileName,"w");
int i,count ;
char *s ;
if(!fstream) return false;
count = (DataSet->FieldCount < FieldCount)?DataSet->FieldCount:FieldCount ;
DataSet->DisableControls();
for(DataSet->First();!DataSet->Eof;DataSet->Next())
{
s = StrECopy(buff,DataSet->Fields->Fields[0]->Text.c_str());
//用StrECopy要比+操作符快。
for(i = 1 ; i < count; ++i)
{
*s++ = separator ; //default separator = '0x09' ;//TAB分隔符。
s = StrECopy(s,DataSet->Fields->Fields[i]->Text.c_str());
}
fputs(buff,fstream);
}
DataSet->EnableControls();
fclose(fstream);
return true;
}
wildhorse01 2003-03-21
  • 打赏
  • 举报
回复
听取PPower(榜榜榜...XunSun)的建议吧
并且,我认为放到线程单独处理比较好吧!
勉励前行 2003-03-21
  • 打赏
  • 举报
回复
strGen是定義成AnsiString吧,那樣不慢才怪。
因為每寫一次就要重新分配一次內存,用來保證有足夠的空間存放字符串,而你這字符串實在太長了。
這種情況,應該用文件流來做(不要用內存流),這樣就不會因為要大量的申請內存而讓速度變得象牛一樣慢。

scy_cd 2003-03-21
  • 打赏
  • 举报
回复
建议使用Oracle存储过程来实现,你可以查一查UTL,速度应该是最快的,我曾经测试过4个字段100万条记录大约用2分钟
lvjack 2003-03-21
  • 打赏
  • 举报
回复
没人讨论:(
大家是没什么更好的办法还是嫌分少?
wx_zfjacky 2003-03-21
  • 打赏
  • 举报
回复
给你一个参考程序,这是一个从.dbf原始文件中提取数据转换成文本的一部分:for(int j=1;j<=Recnum;j++)
{
FileRead(iFileHandle,Buf,Reclen);
Buf[Reclen]='\0';
buf[len]=Buf[0];
//读出一条记录放入RecordValues中
for(int i=0;i<FieldNum;i++)
{
for(unsigned int k=Temp;k<Temp+TypeLen[i];k++)
{
len++;
buf[len]=Buf[k];
}
Temp=Temp+TypeLen[i];
len++;
buf[len]=SepCh;

};
buf[len+1]='\r';
buf[len+2]='\n';
buf[len+3]='\0';
if(FileWrite(iTFileHandle,buf ,len+3)==-1)
{
MessageBox(NULL,((AnsiString)SourceFile+"写入目标文件出错\n").c_str() ,"错误",MB_ICONERROR | MB_OK);
FileClose(iTFileHandle);
DeleteFile((AnsiString)TargetDirector+"\\Wx_"+ \
ExtractFileName(ChangeFileExt(SourceFile,".txt")));
return 0;
};
Temp=1;
len=0;
};
wx_zfjacky 2003-03-21
  • 打赏
  • 举报
回复
for ( int i=0; i < Query->RecordCount;i++)
{
for(int j=0;j<Query->FieldCount;j++)
{
strGen=strGen + Query->Fields->Fields[j]->AsString + ",";
}
Query->Next();
Application->ProcessMessages();
//SBar1->SimpleText="写入第 " + IntToStr(i) + " 条数据";
strGen=strGen + "\r\n" ;
}
这样的程序我写过,关键在于字符串的运算符重载太费时,用一个数组变量,再采用strcat()
等函数速度会提升的很快,我的程序对一个十万条记录的数据库的格式转换不会超过10秒
PoneyChen 2003-03-21
  • 打赏
  • 举报
回复
#include <iostream>
#include <fstream>

ofstream out(filename,ios_base::out);
while(!Qry->Eof){
out<< Qry->FieldByName("field")->AsString <<endl;
Qry->Next();
}
lvjack 2003-03-20
  • 打赏
  • 举报
回复
//Application->ProcessMessages();不管用

TO yesry()
我是将查询结果写入CSV文件,而且用的是Oracle数据库
对于:
这一句非常费时
strGen=strGen + "\r\n" ;
有什么解决办法?

To PoneyChen(Poney)
我是个初学者,而且C++基础很差,你能说的更清楚点么?我不明白STL iostream写入文件怎么用
PoneyChen 2003-03-20
  • 打赏
  • 举报
回复
为何要将这么多纪录放在strGen中, 可以使用STL iostream写入文件, 很快的
yesry 2003-03-20
  • 打赏
  • 举报
回复
这一句非常费时
strGen=strGen + "\r\n" ;
yesry 2003-03-20
  • 打赏
  • 举报
回复
SQL Server自带的导出功能
houzy123 2003-03-20
  • 打赏
  • 举报
回复
//Application->ProcessMessages();

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧