從文本讀出,錄入資料庫,txt文本容量約900M(大概300W行)
跑了幾個文本后,報錯如下:

請教原因何在,如何解決?
代碼如下
TStringList *fList=new TStringList();
fList->LoadFromFile(".\\fname.txt"); //419個檔案名串列,用于逐行打開
String filePath;//打開的檔案路徑全名
String fileName;
String fileYea;//從檔案命中獲取年份,用于判斷插入不同年代的表
for(int k=0;k<fList->Count;k++) //一共419個檔案
{
fileName=fList->Strings[k]; //獲取檔案名串列中的名字
fileYea=fileName.SubString(25,4);
filePath="E:\\全球地面天氣報\\"+ fileName;
TStringList *myStringList=new TStringList();
myStringList->LoadFromFile(filePath);//逐個 打開檔案
String strSql;
String Station,yea,mon,day,hh,longitude,latitude,hight,temp,flag ;
//打開一個檔案后進行入庫
for(int i=0;i < myStringList->Count;i++)
{
Station=myStringList->Strings[i].SubString(1,5);
yea= myStringList->Strings[i].SubString(7,4);
mon=myStringList->Strings[i].SubString(12,2);
day= myStringList->Strings[i].SubString(15,2);
hh= myStringList->Strings[i].SubString(18,2);
longitude= myStringList->Strings[i].SubString(21,5);
latitude= myStringList->Strings[i].SubString(28,5);
hight= myStringList->Strings[i].SubString(34,5);
temp= myStringList->Strings[i].SubString(81,4);
flag = myStringList->Strings[i].SubString(296,1);
strSql="insert into [History_Data].[dbo].[raw_"+fileYea+"] values('"+Station+"','" ; //這里通過檔案名中的年份,實作自動插入不同年份表
strSql=strSql+yea +"','"+mon+"','"+day+"','"+hh+"','"+longitude+"','"+latitude+"','"+hight+"','"+temp+"','"+flag+"')";
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(strSql);
ADOQuery1->ExecSQL();
}
delete myStringList;
}
delete fList;
Application->Terminate();
uj5u.com熱心網友回復:
打檔案不能這么簡單的讀寫,占用記憶體較大http://bbs.csdn.net/topics/230025654
http://bbs.csdn.net/topics/380241844
uj5u.com熱心網友回復:
先拆分一下txt再處理uj5u.com熱心網友回復:
檔案I/O函式這類函式完成對檔案的讀寫相關的操作,這種型別的操作和C的基于I/O檔案操作類似,下表列出這類操作常用的函式及其功能。
FileOpen() 打開檔案
FileClose() 關閉檔案
FileRead() 讀檔案
FileSeek() 檔案定位
FileWrite() 寫檔案
FileCreate() 創建檔案
下面就對這些函式作詳細介紹。
⑴FileOpen()
原型:extern PACKAGE int __fastcall FileOpen(const AnsiString FileName, int Mode);
功能:打開檔案,如果成功回傳其句柄,否則回傳-1
引數:FileName:要打開的檔案名;Mode:打開的方式,取值如下表,可用"或"("|")運算子連接。
常量 值 說明
-------------------------------------------------------------
fmOpenRead 0 以只讀屬性打開
fmOpenWrite 1 以只寫屬性打開
fmOpenReadWrite 2 以讀/寫屬性打開
fmShareCompat 0 兼容FCB方式(匯編中有相應的DOS功能呼叫,感興趣自已查閱相關資料)
fmShareExclusive 16 共享方式:以獨占方式打開,在關閉以前,別人不能訪問
fmShareDenyWrite 32 共享方式:拒絕寫訪問
fmShareDenyRead 48 共享方式:拒絕讀訪問
fmShareDenyNone 64 共享方式:無限制,允許讀寫
例:int i=FileOpen("C://WINDOWS//Win.ini",fmOpenReadWrite|fmShareExclusive);
⑵FileClose()
原型:extern PACKAGE void __fastcall FileClose(int Handle);
功能:關閉打開的句柄。
引數:Handle:要關閉的句柄
例:FileClose(i);
⑶FileRead()
原型:extern PACKAGE int __fastcall FileRead(int Handle, void *Buffer, int Count);
功能:讀檔案,回傳實際讀取的位元組數,句柄必須首先由FileOpen或FileCreate創建。
引數:Handle:要讀取的句柄;Buffer:存放讀取的資料的緩沖區;Count:想讀取的位元組數
例:char str[400];FileRead(hnd1,str,400);
⑷FileSeek()
原型:extern PACKAGE int __fastcall FileSeek(int Handle, int Offset, int Origin);
功能:移動檔案讀取指標,成功回傳檔案指標的位置,失敗回傳-1
引數:Handle:相關聯的句柄;Offset:移動的量;Orgin:移動的基準,0=檔案頭,1=當前位置,2=檔案尾。
例:ShowMessage(FileSeek(hnd1,0,2));//取得檔案的長度
⑸FileWrite()
原型:extern PACKAGE int __fastcall FileWrite(int Handle, const void *Buffer, int Count);
功能:寫檔案,回傳實際寫入的位元組數,句柄必須首先由FileOpen或FileCreate創建。
引數:Handle:要寫入的句柄;Buffer:存放寫入資料的緩沖區;Count:想寫入的位元組數
例:char str[]="I Love You";FileWrite(hnd1,str,strlen(str));
⑹FileCreate()
原型:extern PACKAGE int __fastcall FileCreate(const AnsiString FileName);
功能:創建檔案。成功回傳其句柄,否則回傳-1
引數:FileName:要創建的檔案名
例:if(!FileExists("KC.C"))hnd1=FileCreate("KC.C");
uj5u.com熱心網友回復:
讀大文本,有沒有簡單快速的方法uj5u.com熱心網友回復:
你讀大檔案最好還是用CreateFile,ReadFile,我嘗試過用這個處理過很大的檔案,幾十G是完全沒有問題的。uj5u.com熱心網友回復:
前段時間做一個資料檔案處理,當資料檔案太大時,讀取會出現問題,測驗到了460M以上會有問題。系統可能分配不了這么大的整塊記憶體而出現錯誤,后來采用記憶體映射來解決,另外一個程式采用將資料檔案分割成多個檔案實作,希望對你有幫助。uj5u.com熱心網友回復:
可以看看《windows核心編程》的第17章 記憶體映射檔案,或許會有幫助;轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/95776.html
標籤:基礎類
上一篇:UUFLV.ocx怎么用
下一篇:配置開源庫的步驟
