線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2390
推到 Plurk!
推到 Facebook!

Tstringlist的count只到18654筆

答題得分者是:careychen
jokesmile
一般會員


發表:5
回覆:9
積分:2
註冊:2007-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-29 15:25:32 IP:221.169.xxx.xxx 訂閱
我有一個文件
總共有38460
0 ***** ***** ***** ***** *****
1 ****** ****** ***** ***** *****
2 ***** ****** ***** ******
.
.

總共有38460筆
但我每次跑到18654 就會發生錯誤
經過查看 TstringList.count 為18654
請問這樣是正常的嗎

但若我若要匯入 38460筆資料 用哪個元件較好呢
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-29 16:15:09 IP:122.117.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-29 16:31:40 IP:220.141.xxx.xxx 訂閱
用以下的方式,保證沒問題,如果真的有問題,那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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-29 16:33:56 IP:114.137.xxx.xxx 未訂閱
所謂每次包到18654就發生錯誤
1.什麼錯誤, 你又沒提
2.怎麼跑, 也看不到你的程式
這樣如何幫你解決"這是正常" 的問題?
===================引 用 jokesmile 文 章===================
我有一個文件
總共有38460
0 ***** ***** ***** ***** *****
1 ****** ****** ***** ***** *****
2 ***** ****** ***** ******
.
.

總共有38460筆
但我每次跑到18654 就會發生錯誤
經過查看 TstringList.count 為18654
請問這樣是正常的嗎

但若我若要匯入 38460筆資料 用哪個元件較好呢
jokesmile
一般會員


發表:5
回覆:9
積分:2
註冊:2007-11-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-29 18:35:02 IP:59.126.xxx.xxx 訂閱
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 重新編輯於 2008-10-29 18:44:14, 註解 無‧
jokesmile 重新編輯於 2008-10-29 18:45:14, 註解 無‧
jokesmile 重新編輯於 2008-10-29 18:46:15, 註解 無‧
jokesmile
一般會員


發表:5
回覆:9
積分:2
註冊:2007-11-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-29 18:42:18 IP:59.126.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-29 20:21:24 IP:59.126.xxx.xxx 訂閱
這個連 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-29 21:53:44 IP:220.131.xxx.xxx 訂閱
  我本來也以為是文檔的問題
便把第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 重新編輯於 2008-10-29 21:55:56, 註解 無‧
jokesmile 重新編輯於 2008-10-29 22:02:16, 註解 無‧
jokesmile 重新編輯於 2008-10-29 22:28:10, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-10-30 05:52:50 IP:220.141.xxx.xxx 訂閱
其實用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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-10-30 10:38:10 IP:59.125.xxx.xxx 訂閱
問題的原因,我想是在於「想偷懶」

自己寫過濾程式來拆解字串吧

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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-10-30 14:30:29 IP:202.39.xxx.xxx 訂閱

===================引 用 syntax 文 章===================
問題的原因,我想是在於「想偷懶」

自己寫過濾程式來拆解字串吧

TString 並不適合這樣用

#09 是問題原因,你必須確定欄位中的資料,沒有 #09 ,不管是出現在哪一種編碼為符號,都會造成問題

很多時候,問題,都是自己製造的喔!
-----------------
可是這檔案不是我自己的 是別人給我的
已經跟他確認過了 他說是用TAB鍵做分割
欄位長度也不願意給我 ..... 匯入access用tab也沒問題(用tab做分割)
Orz....
jokesmile
一般會員


發表:5
回覆:9
積分:2
註冊:2007-11-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-11-04 11:08:06 IP:59.126.xxx.xxx 訂閱
i am sorry ,我用notpad開之後 刪掉某個符號就可以了
真是對不起
benshaoxw
一般會員


發表:1
回覆:6
積分:1
註冊:2008-11-05

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-11-05 10:56:01 IP:121.234.xxx.xxx 訂閱
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;
------
我就是我
系統時間:2024-05-06 10:01:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!