PDA

View Full Version : مبتدی: باز کردن یک فایل متنی از یک محل مشخص



alaveh
پنج شنبه 14 اردیبهشت 1391, 02:34 صبح
سلام

دوستان من یک فایل متنی دارم که 55 میلیون رکورد داره و دارم خط به خط می خونمش و توی SQL Server اضافه می کنم . وسط کار بعد از خوندن 35 میلیون رکورد برنامه قطع شد . حالا از اونجا که 1 روز طول کشید تا این 35 میلیون اضافه شد می خوام برنامه رو ببرم سر همون رکورد و از همونجا شروع کنم . چطور باد این کار رو بکنم ؟ دستورات استفاده شده هم در ادامه می نویسم :


procedure TForm1.Rec();
var
fHandle : Textfile;
sBuffer : ansistring;
begin
try
AssignFile(fHandle,'c:/x.txt');
Reset(fHandle);
except
showmessage('فایل باز نشد');
exit();
end;
while NOT Eof(fHandle) do
begin
Readln(fHandle, sBuffer);
..........................
......................................
end;
END;

سعید صابری
پنج شنبه 14 اردیبهشت 1391, 05:43 صبح
فکر کنم

Seek(fHandle,35000000);


باشه

Felony
پنج شنبه 14 اردیبهشت 1391, 09:03 صبح
اون توابع AssignFile و ... که استفاده کردید مربوط به پاسکال هستند و در حال حاظر منسوخ شدن ؛ بهتره از کلاس TStringList استفاده کنید :

var
fHandle: TStringList;
sBuffer: ansistring;
I: Integer;
begin
fHandle := TStringList.Create;
try
fHandle.LoadFromFile('c:/x.txt');
for I := 35000000 to fHandle.Count - 1 do
sBuffer := fHandle.Strings[I];
finally
fHandle.Free;
end;
end;

alaveh
پنج شنبه 14 اردیبهشت 1391, 22:54 عصر
اون توابع AssignFile و ... که استفاده کردید مربوط به پاسکال هستند و در حال حاظر منسوخ شدن ؛ بهتره از کلاس TStringList استفاده کنید :


ممنون آقای تاجیک
ولی نتونست فایل منو باز کنه
حجمش زیاده
حدود 2 گیگابایت
چطور بازش کنم ؟

alaveh
پنج شنبه 14 اردیبهشت 1391, 22:59 عصر
فکر کنم

Seek(fHandle,35000000);


باشه

ممنون دوست عزیز ولی کار نکرد . فرمتش اشتباهه . همین فرمت درستشو بهم بگی ممنون میشم . هر چی گشتم پیدا نکردم . تو کتاب پاسکال هم نبود .

سعید صابری
پنج شنبه 14 اردیبهشت 1391, 23:17 عصر
قاعده اش همینه


// Seek (move) to the start of the 3rd record
Seek(myFile, 2); // Records start from 0

alaveh
جمعه 15 اردیبهشت 1391, 00:05 صبح
قاعده اش همینه


// Seek (move) to the start of the 3rd record
Seek(myFile, 2); // Records start from 0


به هر صورت این که جواب نمیده

ممکنه برای فایلهای باینری باشه

فایل من تکسته

از وقتی که گذاشتید ممنونم

alaveh
جمعه 15 اردیبهشت 1391, 00:06 صبح
دوستان اگر کسی می تونه کمک کنه

آقای تاجیک اگر تونستید در مورد باز کردن فایلهای با حجم بالا با اون دستوراتی که فرمودید راهنمایی بفرمایید

سعید صابری
جمعه 15 اردیبهشت 1391, 00:24 صبح
بله .حق با شماست
اینو از stackoverflow گرفتم

function TextSeek(var f: Text; position: Int64): boolean;
var pos64: Int64Rec absolute position;
resHi: cardinal;
begin
result := false;
with TTextRec(f) do
begin
if mode<>fmInput then
exit;
resHi := pos64.Hi;
if (SetFilePointer(handle,pos64.Lo,@resHi,FILE_BEGIN)<>pos64.Lo) or
(resHi<>pos64.Hi) then
exit;
BufEnd := 0; // flush internal reading buffer
BufPos := 0;
result := true; // success
end;
end;



تست هم کردم جواب داد

Mahmood_M
جمعه 15 اردیبهشت 1391, 00:50 صبح
دستور Seek برای فایلهای متنی کاربرد نداره
با اجرای دستور Readln ، برنامه به خط بعد میره ، شما می تونید بعد از باز کردن فایل به تعداد دلخواه Readln رو اجرا کنید تا اشاره گر فایل به خط مورد نظر شما بره ، مثلا برای رفتن به خط شماره ی 10 میشه به این صورت عمل کرد :

var
F : TextFile;
I : Integer;
S : String;
begin
AssignFile(F, 'C:\M.txt');

Reset(F);

try
for I := 1 to 9 do
Readln(F);

Readln(F, S);

finally
CloseFile(F);
end;

end;

البته چون حجم فایل زیاد هست ممکنه کمی کند عمل کنه
برای آشنایی با کلاس TStrings یا TStringList این صفحه (http://barnamenevis.org/showthread.php?79100-%D9%85%D9%82%D8%A7%D9%84%D9%87-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D8%AA%D8%AF%D9%87%D8%A7%D8%8C-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D9%88-%D8%AE%D8%B5%D9%88%D8%B5%DB%8C%D8%AA%D9%87%D8%A7%D B%8C-TStrings) رو ببینید
یک راه دیگه در اینجا (http://stackoverflow.com/questions/4717621/seek-for-textfile) پیشنهاد شده که می تونه کمکتون کنه

موفق باشید ...

ویرایش : جوابها همزمان شد !

Felony
جمعه 15 اردیبهشت 1391, 05:50 صبح
ممنون آقای تاجیک
ولی نتونست فایل منو باز کنه
حجمش زیاده
حدود 2 گیگابایت
چطور بازش کنم ؟
از کلاس TFileStream استفاده کنید .