Tstringlist的count只到18654筆 |
答題得分者是:careychen
|
jokesmile
一般會員 發表:5 回覆:9 積分:2 註冊:2007-11-08 發送簡訊給我 |
|
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
1.我試不會呀
var ss:TStringList; begin ss:=TStringList.Create; ss.LoadFromFile('w:\PATHO.TXT'); caption:='Load Record count=' intTostr(ss.Count); ss.Free end; 2.請以NOTEPAD開看看Go 18654行 ===================引 用 jokesmile 文 章=================== 我有一個文件 總共有38460 0 ***** ***** ***** ***** ***** 1 ****** ****** ***** ***** ***** 2 ***** ****** ***** ****** . . 總共有38460筆 但我每次跑到18654 就會發生錯誤 經過查看 TstringList.count 為18654 請問這樣是正常的嗎 但若我若要匯入 38460筆資料 用哪個元件較好呢
------
What do we live for if not to make life less difficult for each other? |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
用以下的方式,保證沒問題,如果真的有問題,那Delphi我勸你就別用了。
[code delphi] AssignFile(F, 'C:\MyDoc.txt'); //打開文件,以供後面讀取 Reset(F); //如果沒有到最後一行 while not Eof(F) do begin Readln(F, Line); //讀取一行內容到Line中 AdoTable1.Field['資料'] := Line; end; CloseFile(F); [/code]
------
努力會更接近成功 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
所謂每次包到18654就發生錯誤
1.什麼錯誤, 你又沒提 2.怎麼跑, 也看不到你的程式 這樣如何幫你解決"這是正常" 的問題? ===================引 用 jokesmile 文 章=================== 我有一個文件 總共有38460 0 ***** ***** ***** ***** ***** 1 ****** ****** ***** ***** ***** 2 ***** ****** ***** ****** . . 總共有38460筆 但我每次跑到18654 就會發生錯誤 經過查看 TstringList.count 為18654 請問這樣是正常的嗎 但若我若要匯入 38460筆資料 用哪個元件較好呢 |
jokesmile
一般會員 發表:5 回覆:9 積分:2 註冊:2007-11-08 發送簡訊給我 |
if FileExists(FileName) then
begin L := TStringList.Create; try L.LoadFromFile(FileName); M := TStringList.Create; try for i := 1 to L.Count-1 do begin M.Delimiter := #09; //tab為分隔伏號 M.DelimitedText := L[I]; //L[I] stand for L.Strings[I] insertSql:=''; insertSql:= 'insert into TableName(xxx,xxx,xxx,xxx) '; insertSql:= insertSql ' values(:pxxx,:pxxx,:pxxx,pxxx) '; dm.QyImport.Close; dm.QyImport.SQL.Clear; dm.QyImport.SQL.Add(insertSql); dm.QyImport.ParamByName('xxx').Value:=M[1]; //xxx為欄位名 dm.QyImport.ParamByName('xxx'').Value:=M[4]; //xxx為欄位名 dm.QyImport.ParamByName('xxx').Value:=M[5]; //xxx為欄位名 dm.QyImport.ParamByName('xxx').Value:=M[6]; //xxx為欄位名 dm.QyImport.ExecSQL; end; finally FreeAndNil(M); showmessage('匯入資料筆數' inttostr(i)); end; finally FreeAndNil(L); end; 最後 跑至18654筆 出現error 錯誤訊息 為 list index out of bounds(5) 我for迴圈改用 for I := L.Count-1 downto 1 do i的值為18654 |
jokesmile
一般會員 發表:5 回覆:9 積分:2 註冊:2007-11-08 發送簡訊給我 |
===================引 用 pceyes 文 章=================== 用以下的方式,保證沒問題,如果真的有問題,那Delphi我勸你就別用了。 [code delphi] AssignFile(F, 'C:\MyDoc.txt'); //打開文件,以供後面讀取 Reset(F); //如果沒有到最後一行 while not Eof(F) do begin Readln(F, Line); //讀取一行內容到Line中 AdoTable1.Field['資料'] := Line; end; CloseFile(F); [/code] 這個類似的我也有寫 如下:::: assignfile(Infile,Filename); reset(infile); i:=0; M := TStringList.Create; try while not Eoln(infile) do begin readln(infile,strinstring); M.Delimiter:=#09; M.DelimitedText:=strinstring; insertSql:=''; insertSql:= 'insert into TableName(xxx,xxx,xxx,xxx) '; insertSql:= insertSql ' values(:pxxx,:pxxx,:pxxx,:pxxx) '; dm.QyImport.Close; dm.QyImport.SQL.Clear; dm.QyImport.SQL.Add(insertSql); dm.QyImport.ParamByName('pxxx).Value:=M[1]; dm.QyImport.ParamByName('pxxx').Value:=M[4]; dm.QyImport.ParamByName('pxxx').Value:=M[5]; dm.QyImport.ParamByName('pxxx').Value:=M[6]; dm.QyImport.ExecSQL; i:=i 1; end; finally FreeAndNil(M); showmessage('匯入資料筆數' inttostr(i)); 但我不想要文檔的一行 因為都是欄位名稱 不知道程式如何控制他跳過第一行? 手動刪除第一行 卻發現程式跑到 dm.QyImport.ParamByName('pxxx).Value:=M[1]; 時就發生錯誤訊息 list index out of bounds(1)
編輯記錄
jokesmile 重新編輯於 2008-10-29 18:46:51, 註解 無‧
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
這個連 po 兩個文,您不知道有沒有發現您都是用
M.Delimiter:=#09; M.DelimitedText:=strinstring; 而錯誤訊息就是如下兩個 list index out of bounds(5) list index out of bounds(1) 很明顯您的文字裡不符合規則,也就是中間是 #9 的字元!!!!!! 請自行再三確認一下 有時畫面上看到不一定是真的哦!!! 你有 Notepad 打開看到中間是空的,不代表他就是 #9 哦,也許是一堆空白字元!!!
------
價值的展現,來自於你用哪一個角度來看待它!! |
jokesmile
一般會員 發表:5 回覆:9 積分:2 註冊:2007-11-08 發送簡訊給我 |
我本來也以為是文檔的問題
便把第18654筆的資料給刪掉 結果 本來還可以跑到18654筆的資料 竟然連半筆都無法跑 我是刪中間的資料欄 結果卻連一筆都無法匯入 = =""""(這是為什麼呢???) 錯誤訊息為 list index out of bounds(1) 可是我跟本沒動到第一筆資料阿? 後來有想乾脆 直接從18655開始跑 結果直接竟然沒有進迴圈 直接跳到finally裡 顯示結果 匯入檔案0筆 後來用斷點查 L.count-1為18654 難怪跑不進迴圈,如下 for i:=18655 to L.count-1 do begin . . end ps.在下是用delphi 6 文檔為用tab做分隔符號的csv檔 除非是文檔的回車或換行符號有問題 但若是這樣 為何我刪了其中一筆資料 就變成連第一筆都讀不進去了 ><""" 後來就想到用AssignFile realln的方式做 可是第一筆欄位名的資料 無法跳過 我就用手動刪除(是我刪東西的緣故嗎?) 結果也是如此 list index out of bounds(1) 有沒有辦法可以直接跳到第二筆資料呢? |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
其實用TStringList(畢竟物件要Create)也是可以的,但個人認為AssignFile速度比較快,不過檔案大才感受得到。
下面是我改的Code您試試。 [code delphi] assignfile(Infile,Filename); reset(infile); i:=0; M := TStringList.Create; X := TStringList.Create; // 錯誤資料放置處 O := TStringList.Create; // 正確資料放置處 try while not Eoln(infile) do begin readln(infile,strinstring); M.Delimiter:=#09; M.DelimitedText:=strinstring; if i = 0 then begin FieldCount := M.count; // 取得第一筆的欄數 end; if ( i <> 0 )and( M.count = FieldCount ) then begin // 非第一筆 且 非資料錯誤 // 假設資料庫的處理沒問題,先Remark { insertSql:=''; insertSql:= 'insert into TableName(xxx,xxx,xxx,xxx) '; insertSql:= insertSql ' values(:pxxx,:pxxx,:pxxx,:pxxx) '; dm.QyImport.Close; dm.QyImport.SQL.Clear; dm.QyImport.SQL.Add(insertSql); dm.QyImport.ParamByName('pxxx).Value:=M[1]; dm.QyImport.ParamByName('pxxx').Value:=M[4]; dm.QyImport.ParamByName('pxxx').Value:=M[5]; dm.QyImport.ParamByName('pxxx').Value:=M[6]; dm.QyImport.ExecSQL;} // 抓取Stringlist的資料測試 O.strings.add(M[1] ' ' M[4] ' ' M[5] ' ' M[6]); end else X.strings.add(strinstring); // 裏面有第一筆資料 暨 有問題的資料 end; i:=i 1; end; finally FreeAndNil(M); showmessage('匯入資料筆數' inttostr(i)); // 最後你將O.strings.savetofile('Right.txt'); // 將X.strings.savetofile('Error.txt'); // 大概可以知道問題在哪裏了 [/code]
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-10-30 06:00:19, 註解 無‧
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
問題的原因,我想是在於「想偷懶」
自己寫過濾程式來拆解字串吧 TString 並不適合這樣用 #09 是問題原因,你必須確定欄位中的資料,沒有 #09 ,不管是出現在哪一種編碼為符號,都會造成問題 很多時候,問題,都是自己製造的喔! ===================引 用 jokesmile 文 章=================== 我本來也以為是文檔的問題 便把第18654筆的資料給刪掉 結果 本來還可以跑到18654筆的資料 竟然連半筆都無法跑 我是刪中間的資料欄 結果卻連一筆都無法匯入 = =""""(這是為什麼呢???) 錯誤訊息為 list index out of bounds(1) 可是我跟本沒動到第一筆資料阿? 後來有想乾脆 直接從18655開始跑 結果直接竟然沒有進迴圈 直接跳到finally裡 顯示結果 匯入檔案0筆 後來用斷點查 L.count-1為18654 難怪跑不進迴圈,如下 for i:=18655 to L.count-1 do begin . . end ps.在下是用delphi 6 文檔為用tab做分隔符號的csv檔 除非是文檔的回車或換行符號有問題 但若是這樣 為何我刪了其中一筆資料 就變成連第一筆都讀不進去了 ><""" 後來就想到用AssignFile realln的方式做 可是第一筆欄位名的資料 無法跳過 我就用手動刪除(是我刪東西的緣故嗎?) 結果也是如此 list index out of bounds(1) 有沒有辦法可以直接跳到第二筆資料呢? |
jokesmile
一般會員 發表:5 回覆:9 積分:2 註冊:2007-11-08 發送簡訊給我 |
===================引 用 syntax 文 章=================== 問題的原因,我想是在於「想偷懶」 自己寫過濾程式來拆解字串吧 TString 並不適合這樣用 #09 是問題原因,你必須確定欄位中的資料,沒有 #09 ,不管是出現在哪一種編碼為符號,都會造成問題 很多時候,問題,都是自己製造的喔! ----------------- 可是這檔案不是我自己的 是別人給我的 已經跟他確認過了 他說是用TAB鍵做分割 欄位長度也不願意給我 ..... 匯入access用tab也沒問題(用tab做分割) Orz.... |
jokesmile
一般會員 發表:5 回覆:9 積分:2 註冊:2007-11-08 發送簡訊給我 |
|
benshaoxw
一般會員 發表:1 回覆:6 積分:1 註冊:2008-11-05 發送簡訊給我 |
if FileExists(FileName) then
begin L := TStringList.Create; try L.LoadFromFile(FileName); M := TStringList.Create; try for i := 1 to L.Count-1 do begin M.Delimiter := #09; //tab為分隔伏號 M.DelimitedText := L[I]; //L[I] stand for L.Strings[I] insertSql:=''; insertSql:= 'insert into TableName(xxx,xxx,xxx,xxx) '; insertSql:= insertSql ' values(:pxxx,:pxxx,:pxxx,pxxx) '; dm.QyImport.Close; dm.QyImport.SQL.Clear; dm.QyImport.SQL.Add(insertSql); dm.QyImport.ParamByName('xxx').Value:=M[1]; //xxx為欄位名 dm.QyImport.ParamByName('xxx'').Value:=M[4]; //xxx為欄位名 dm.QyImport.ParamByName('xxx').Value:=M[5]; //xxx為欄位名 dm.QyImport.ParamByName('xxx').Value:=M[6]; //xxx為欄位名 dm.QyImport.ExecSQL; end; finally FreeAndNil(M); showmessage('匯入資料筆數' inttostr(i)); end; finally FreeAndNil(L); end;
------
我就是我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |