PDA

View Full Version : سوال: تبدیل اطلاعات یک فایل متنی (txt) و وارد کردن آنها به بانک اطلاعاتی



hamid-nic
پنج شنبه 04 آذر 1389, 18:35 عصر
سلام دوستان ، وقتتان بخیر
یک فایل متنی با پسوند txt داریم با این فرمت :
فیلد1(6) $ فیلد2(7) $ فیلد3(30) $ فیلد4(30) $ فیلد5(15) $ فیلد6(3) $ فیلد7(2) $ فیلد8(10) $ فیلد9(40)
(اعداد داخل پرانتز تعداد کاراکتر های فیلد را مشخص می کند )

به طور مثال :
174023$1034235$علیزاده $حسین $علی $مرد$63$123 $Hoseinu@yahoo.com
$8613451$316432عسگری $احمد $هاشم $مرد$65$1335 $ Ha4323@gmail.com
$7874564$126765حلوایی $نرگس $غلام $زن $66$5432789654$Nar-ha@yahoo.com ($Narges-ha@yahoo.com)
.
.
.
می خواهم این اطلاعات را تبدیل کرده و وارد بانک اطلاعاتی کنم . (یعنی کاربر خودش فایل متنی را انتخاب کنه و برنامه اون را تبدیل کنه) تعداد سطر های این فایل متنی متغیر بوده هر بار بین 100 تا 400 خط است .
به نظر شما از چه روشی و چگونه این کار را انجام بدم که هم سرعت خوبی و هم دقت خوبی برای این کار داشته باشه .
فایل نمونه متنی را پیوست می کنم . (فایل را که باز کردید یک بار Ctrl+Shift راست صفحه کلید را بزنید تا متن درست نمایش داده شود)
باتشکر از این که راهنمایی می کنید .

Felony
پنج شنبه 04 آذر 1389, 18:46 عصر
400 خط متن چیزی نیست که نگران سرعت پردازشش باشید ، فرمت فایلی هم که دادید چندان پیچیده نیست ، توسط یک TStringList و توابع Copy و PosEX تو یک حلقه متن رو Parse کنید و داخل همون حلقه هر خطی رو که پردازش کردید داخل بانکتون درجش کنید .

hamid-nic
پنج شنبه 04 آذر 1389, 18:55 عصر
آقا مجتبی عزیز ممنون از راهنمایی تون .
میشه یک نمونه بزارید تا بتونم از اون الگو بگیرم و برنامه را پیاده سازی کنم .
ممنون.

Mahmood_M
پنج شنبه 04 آذر 1389, 20:14 عصر
می تونید از خاصیت Delimiter شیء ای مثل StringList استفاده کنید ، یک نمونه ضمیمه کردم ، موفق باشید ...

hamid-nic
پنج شنبه 04 آذر 1389, 20:31 عصر
ممنون Mahmood_N جان
با کدام ورژن نوشته شده من با ورژن 7 باز کردم اما مثل اینکه کامل باز نشد .

Mahmood_M
پنج شنبه 04 آذر 1389, 20:38 عصر
با ورژن 2010 ، چیز خاصی داخلش نیست ، چه مشکلی پیش اومد ؟

hamid-nic
پنج شنبه 04 آذر 1389, 20:49 عصر
موقع باز کردن خطاهای زیر را داد :

Error Reading form
OpenBtn.DoubleBuffered
OpenBtn.parentDoubleBuffered
Bitbtn1.DoubleBuffered
Bitbtn1.parentDoubleBuffered
موقع اجرا هم به این خط ایراد گرفت :

Application.MainFormOnTaskbar := True;
که البته اون خط را حذف کردم و برنامه اجرا شد اما با همون فایلی که در پست اول ضمیمه کردم تست کردم خطای زیر را می دهد

'ï»؟174023' is not a valid integer value.
من فکر کنم درست اون Section ها را جدا نمی کنه . نظر شما چیه ؟

hamid-nic
پنج شنبه 04 آذر 1389, 21:00 عصر
درحالت عادی وقتی اون فایل متنی که در پست اول ضمیمه کردم را اجرا کنم باید یک بار Ctrl+Shift سمت راست صفحه کلید را یک بار بزنیم تا اطلاعات درست نمایش داده شود فکر کنم وقتی متن را درونStringList لود می کنیم اولا همین مشکل را دارد و بعد هم متن های فارسی بصورت ؟ لود میشه این مشکل ها را چطوری حل کنیم ؟:متفکر:

hamid-nic
پنج شنبه 04 آذر 1389, 22:20 عصر
آقا محمود مشکل حل شد .
Encoding فایل متنی را از UTF8 به Ansi تغییر دادم .
حالا چطوری باید تشخیص داد که Encoding فایل متنی چیه و اون را به Ansi تبدیل کرد ؟:متفکر:

hamid-nic
جمعه 05 آذر 1389, 11:04 صبح
سلام
دو تا مشکل بوجود اومده :
1- متن های فارسی وقتی چند قسمتی باشه هر کدام توی یک فیلد میشینه . یعنی مثلا یه نام خانوادگی مثل یوسف علی پور مردانی زاده ، نام یوسف درست در فیلد مربوطه قرار می گیره اما فامیلش توی چهار تا فیلد مختلف قرار می گیره در صورتی که باید علی پور مردانی زاده توی یک فیلد قرار بگیره .
2- حلقه ی درست اجرا نمیشه یعنی پس از اینکه آخرین فیلد از خط اول را خواند به جای اینکه به خط بعدی بره خطای زیر را میده :

---------------------------
Project1
---------------------------
List index out of bounds (52)
---------------------------
OK
---------------------------
لازم به ذکر است که 52 فیلد در یک خط قرار دادم و تعداد خط ها هم تقریبا 200 خط میشه .
به نظر شما مشکل کجاست ؟:متفکر:

hamid-nic
جمعه 05 آذر 1389, 11:32 صبح
مشکل دوم حل شد چون مقدار فیلد آخر خالی بود مشکل داشت که اون را هم کدش را بهینه کردم اما هنوز مشکل اول که در پست قبلی گفتم پا برجاست :متفکر::متفکر::متفکر::متفکر:

hamid-nic
جمعه 05 آذر 1389, 13:48 عصر
عبارت جدا کننده (Delimiter) درست عمل می کنه . عبارت های جدا شده (DelimitedText) درست تشخیص داده میشه اما تکه عبارت های جدا شده را بصورت واحد فرض نمی کنه یعنی وقتی یک فاصله بین دو کلمه در یک قسمت وجود داشته باشه هر کدام را یک قسمت جدا تشخیص می دهد مشکل اینجاست
بطور مثال :
12009$999999$هاشم $رفیعی زاده اراکی $مرد
در این جا رفیعی را یک قسمت ، زاده را یک قسمت و اراکی را یک قسمت دیگر در نظر می گیره در صورتی که باید باهم باشند .
این مشکل را چطوری حل کنم ؟:متفکر:

Felony
جمعه 05 آذر 1389, 14:30 عصر
عبارت جدا کننده (Delimiter) درست عمل می کنه . عبارت های جدا شده (DelimitedText) درست تشخیص داده میشه اما تکه عبارت های جدا شده را بصورت واحد فرض نمی کنه یعنی وقتی یک فاصله بین دو کلمه در یک قسمت وجود داشته باشه هر کدام را یک قسمت جدا تشخیص می دهد مشکل اینجاست
بطور مثال :
12009$999999$هاشم $رفیعی زاده اراکی $مرد
در این جا رفیعی را یک قسمت ، زاده را یک قسمت و اراکی را یک قسمت دیگر در نظر می گیره در صورتی که باید باهم باشند .
این مشکل را چطوری حل کنم ؟:متفکر:

StrictDelimiter شیئی رو که از TStringList مشتق کردید با True مقدار دهی کنید ، مثلا :
var
Str: TStringList;
begin
Str:= TStringList.Create;
try
Str.Delimiter:= '$';
Str.StrictDelimiter:= True;
Str.DelimitedText:= '$Sample Text $Man $+9891244566 $www.barnamenevis.org';
ShowMessage(Str.Text);
finally
Str.Free;
end;
end;

hamid-nic
جمعه 05 آذر 1389, 17:24 عصر
ممنون آقامجتبي الان پشت سيستمم نيستم . امتحان كرده و نتيجه را اعلام مي كنم .

hamid-nic
جمعه 05 آذر 1389, 19:58 عصر
آقای تاجیک من از دلفی 7 استفاده می کنم و این خصیصه در دلفی 7 نیست . چه راهی پیشنهاد می کنید تا به نتیجه برسم ؟

hamid-nic
جمعه 05 آذر 1389, 20:12 عصر
به جای اون از تکه کد زیر استفاده کردم :
s2.DelimitedText := '"' + StringReplace(S1.Strings[I], s2.Delimiter, '"' + s2.Delimiter + '"', [rfReplaceAll]) + '"';
جواب داد به نظرتون مشکلی داره ؟:متفکر: