Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Hızlı satır okuma bu fonksiyonu çalıştıramadım satır okuma fonksiyonu
#1
Bu kodu bir çin sitesinden buldum ama derlerken hata veriyor Delphi 7 kullanıyorum yardımcı olurmusunuz.

function EnterFile(const FileName:string):TInt64Array;
var
 MyFile:TMemoryStream;
 rArray:TInt64Array;     
 size,curIndex:int64;
 enterCount:int64;
 DoLoop:Boolean;
 pc: PChar;
 arrayCount:int64;
 addStep:integer;
begin
 if fileName = '' then
   Exit;
 if not FileExists(fileName) then
   Exit;
 MyFile:=TMemoryStream.Create;
 MyFile.LoadFromFile(fileName);
 size:=MyFile.Size;
 pc:=MyFile.Memory;
 curIndex:=RowLeast;
 DoLoop:=true;
 enterCount:=0;
 setlength(rArray,perArray);
 arrayCount:=perArray;
 enterCount:=0;
 rArray[enterCount]:=0;
 while DoLoop do
 begin
   addStep:=0;
   if (ord(pc[curIndex])=13) then
     addStep:=2;
   if (ord(pc[curIndex])=10) then
     addStep:=1;
   if (addStep<>0) then
   begin
     Application.ProcessMessages;
     inc(enterCount);
     if (enterCount mod perArray=0) then
     begin
       arrayCount:=arrayCount+perArray;
       setlength(rArray,arrayCount);
     end;
     rArray[enterCount]:=curIndex+addStep;
     curIndex:=curIndex+addStep+RowLeast;
   end
   else
     curIndex:=curIndex+2;
   if curIndex> size then
     DoLoop:=false
   else
     DoLoop:=true;
 end;
 result:=rArray;
 freeandnil(MyFile);
end;
Cevapla
#2
(08-07-2017, Saat: 10:18)Delphiseven Adlı Kullanıcıdan Alıntı: Bu kodu bir çin sitesinden buldum ama derlerken hata veriyor Delphi 7 kullanıyorum yardımcı olurmusunuz.

function EnterFile(const FileName:string):TInt64Array;
var
 MyFile:TMemoryStream;
 rArray:TInt64Array;     
 size,curIndex:int64;
 enterCount:int64;
 DoLoop:Boolean;
 pc: PChar;
 arrayCount:int64;
 addStep:integer;
begin
 if fileName = '' then
   Exit;
 if not FileExists(fileName) then
   Exit;
 MyFile:=TMemoryStream.Create;
 MyFile.LoadFromFile(fileName);
 size:=MyFile.Size;
 pc:=MyFile.Memory;
 curIndex:=RowLeast;
 DoLoop:=true;
 enterCount:=0;
 setlength(rArray,perArray);
 arrayCount:=perArray;
 enterCount:=0;
 rArray[enterCount]:=0;
 while DoLoop do
 begin
   addStep:=0;
   if (ord(pc[curIndex])=13) then
     addStep:=2;
   if (ord(pc[curIndex])=10) then
     addStep:=1;
   if (addStep<>0) then
   begin
     Application.ProcessMessages;
     inc(enterCount);
     if (enterCount mod perArray=0) then
     begin
       arrayCount:=arrayCount+perArray;
       setlength(rArray,arrayCount);
     end;
     rArray[enterCount]:=curIndex+addStep;
     curIndex:=curIndex+addStep+RowLeast;
   end
   else
     curIndex:=curIndex+2;
   if curIndex> size then
     DoLoop:=false
   else
     DoLoop:=true;
 end;
 result:=rArray;
 freeandnil(MyFile);
end;

Merhaba,

Int64 ü LongInt olarak değiştirip deneyebilir misin?
Amatör Küme Bilgisayar Programcısı
WWW
Cevapla
#3
(08-07-2017, Saat: 11:45)barutali Adlı Kullanıcıdan Alıntı: Int64 ü LongInt olarak değiştirdim bu defa 
setlength(rArray,perArray);
ve 
curIndex:=RowLeast;
bu satılarda hata verdi
Cevapla
#4
Kopyala / yapıştırı eksik yapmış yapmışsın. Kodu aldığın linki gönder oradan bakayım.
Amatör Küme Bilgisayar Programcısı
WWW
Cevapla
#5
(08-07-2017, Saat: 12:54)barutali Adlı Kullanıcıdan Alıntı: eksik almadım bu linkte orjinal kod : https://www.bbsmax.com/A/lk5a0B3NJ1/
Cevapla
#6
(08-07-2017, Saat: 10:18)Delphiseven Adlı Kullanıcıdan Alıntı: Bu kodu bir çin sitesinden buldum ama derlerken hata veriyor Delphi 7 kullanıyorum yardımcı olurmusunuz.


Compile aşamasında döndürdüğü hatayı paylaşabilir misiniz? Belki de gerekli kütüphanelerden bazılarını eklemeyi unutmuş olabilirsiniz.



procedure TMainForm.btn2Click(Sender: TObject);
var
  datasIndex:TInt64Array;//数据文件索引
begin
 
  t1:=GetTickCount;
  datasIndex:=ScanEnterFile('R:\201201_dataFile.txt');
  Caption:=Caption+'::'+inttostr(GetTickCount-t1); 
end;

Asıl kullanımı burada gerçekleştiriyor. Siteden pek bir şey anlamadım ama yarım bir çince-ingilizce çevirisi ile Delphi'de hızlı veri taraması yapabilmek için ihtiyaç duymuş. Kullanacağınız asıl fonksiyon ScanEnterFile olacak.

TInt64Array ve Int64'ün bazı sistemsel değişiklikleri AnsiString ve türevlerinin değişikliği ile aynı sürümde yapıldı. Belki de sorununuz Delphi 7 ile ilgilidir. Daha yüksek bir versiyonda denemenizi öneririm. Dilerseniz talebinizi iletin, belki farklı çözümler bulunabilir. İyi günler.
Cevapla
#7
(08-07-2017, Saat: 13:18)Abdullah Ilgaz Adlı Kullanıcıdan Alıntı:
(08-07-2017, Saat: 10:18)Delphiseven Adlı Kullanıcıdan Alıntı: Bu kodu bir çin sitesinden buldum ama derlerken hata veriyor Delphi 7 kullanıyorum yardımcı olurmusunuz.


Button click; çağırma olayında problem yok problem fonksiyonda bu fonksiyon 12 Milyon text satırını 16 saniyede okuyabiliryor. çok hızlı ayroca Delphi 10.1 Berlinde denedim sonuç aynı hata veren satırlar

[Error] Unit1.pas(1248): Undeclared identifier: 'TInt64Array'
setlength(rArray,perArray);



procedure TMainForm.btn2Click(Sender: TObject);
var
  datasIndex:TInt64Array;//数据文件索引
begin
 
  t1:=GetTickCount;
  datasIndex:=ScanEnterFile('R:\201201_dataFile.txt');
  Caption:=Caption+'::'+inttostr(GetTickCount-t1); 
end;
Cevapla
#8
perArray ve RowLeast değişkenlerinin varsayılan değerlerinin olduğu kısım ortada yok. O çin sitesi de ya bir yerden kopyala yapıştır yapmış yada eksik paylaşmış.
Amatör Küme Bilgisayar Programcısı
WWW
Cevapla
#9
(08-07-2017, Saat: 13:39)barutali Adlı Kullanıcıdan Alıntı: perArray ve RowLeast değişkenlerinin varsayılan değerlerinin olduğu kısım ortada yok. O çin sitesi de ya bir yerden kopyala yapıştır yapmış yada eksik paylaşmış.

Hiç güleceğim yoktu.  Big Grin
Çinliler zaten bu konunun (Copy-Paste) uzmanı.
DelphiCan'dır!
Cevapla
#10
(08-07-2017, Saat: 13:34)Delphiseven Adlı Kullanıcıdan Alıntı:
(08-07-2017, Saat: 13:18)Abdullah Ilgaz Adlı Kullanıcıdan Alıntı: Button click; çağırma olayında problem yok problem fonksiyonda bu fonksiyon 12 Milyon text satırını 16 saniyede okuyabiliryor. çok hızlı ayroca Delphi 10.1 Berlinde denedim sonuç aynı hata veren satırlar

[Error] Unit1.pas(1248): Undeclared identifier: 'TInt64Array'
setlength(rArray,perArray);



procedure TMainForm.btn2Click(Sender: TObject);
var
  datasIndex:TInt64Array;//数据文件索引
begin
 
  t1:=GetTickCount;
  datasIndex:=ScanEnterFile('R:\201201_dataFile.txt');
  Caption:=Caption+'::'+inttostr(GetTickCount-t1); 
end;


MainForm'un içinde global tanımlamalara şu tanımı yaparsanız sorun çözülür gibi geliyor.

var
TInt64Array = Array of Int64;
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  E fatura okuma xlm metemet 5 722 06-04-2025, Saat: 19:30
Son Yorum: metemet
  2 Tarih arası periyodik tarih parçalama fonksiyonu adelphiforumz 4 582 17-02-2025, Saat: 17:33
Son Yorum: adelphiforumz
  Mikrotik routher Port okuma Mert_37 1 378 23-08-2024, Saat: 16:46
Son Yorum: Syntax
  Hızlı Satış Hk. Bir Soru erdal51 3 503 19-08-2024, Saat: 11:32
Son Yorum: erdal51
  OPC Server veri okuma enigma 1 882 13-09-2023, Saat: 11:50
Son Yorum: shooterman



Konuyu Okuyanlar: 1 Ziyaretçi