PDA

View Full Version : سوال: جلوگیری از ثبت داده تکراری در فایل متنی



systam
جمعه 29 خرداد 1394, 17:18 عصر
سلام دوستان
برنامه ای دارم مربوط ثبت اطلاعات افراده
که برای ثبت هر فرد میاد شماره آخرین سطر بدست میاره یکی بهش اضافه میکنه اطلاعات نفر بعدی رو در فایل متنی ذخیره میکنه
تا اینجام مشکل ندارم
و در برنامه من قابلیتی رو گذاشتم که کاربر هم بتونه شماره سطرشو به صورت دستی وارد کنه اگه شماره سطر تکراری وارد کرد باید چیکار خطای تکراری بگیره و جلوگیری از ثبت اطلاعات بکنه
عکس ضمیمه :
132405
ممنون میشم راهنماییم کنید

موفق باشید
یا علی

alireza264
جمعه 29 خرداد 1394, 17:54 عصر
سلام
در فایل متنی کاری نمیشه کرد جز جستجوی خطی . اما میتونی فایل رو تو لیست بنویسی و اگه کاربر شماره ای وسط لیست داد فرد جدید رو تو اون مکان بنویسه و بقیه شیفت داده میشن پایین و در پایان لیست رو فایل بنویس

systam
جمعه 29 خرداد 1394, 20:26 عصر
دوستان کسی مثالی نداره
توضیحی چیزی

asman.abi
جمعه 29 خرداد 1394, 23:23 عصر
اگر انتهای فایل رو می خونی و عدد مربوطه رو به دست می آری. دیگه برای چی کاربر تصمیم بگیره شماره چند باشه. شما به ترتیب عدد بزن کارب مشخصات وارد می کنه. دیگه کاربر درگیر شماره مربوط به خودش نشه که چه شماره ای باشه.
چون اعداد به ترتیب هست پس هر عددی کوچک تر از عدد انتهای فایل یعنی تکراری. پس اعداد باید بیشتر از عدد فعلی باشند. ولی شما قابلیت این که شماره رو کاربر انتخاب کنه بردارید اگه لزومی نداره.

systam
شنبه 30 خرداد 1394, 01:47 صبح
چون اعداد به ترتیب هست پس هر عددی کوچک تر از عدد انتهای فایل یعنی تکراری. پس اعداد باید بیشتر از عدد فعلی باشند. ولی شما قابلیت این که شماره رو کاربر انتخاب کنه بردارید اگه لزومی نداره.
سلام
حرف شما درست چون برنامه بایگانی عکسه شاید کاربر خواسته باشه یک عددی مشخص رو برای رهگیری انتخاب کنه
برای همین که این کار مد نظرمه

xman_dj
شنبه 30 خرداد 1394, 08:31 صبح
بیار تو لیست و از چک کردن رشته برای شماره اول هر رشته استفاده کن.

مثلا ببین اگه رشته تو 3 باشه فقط به کاربر با شماره 3 این دسترسی رو بده.

alireza264
شنبه 30 خرداد 1394, 12:28 عصر
سلام
حرف شما درست چون برنامه بایگانی عکسه شاید کاربر خواسته باشه یک عددی مشخص رو برای رهگیری انتخاب کنه
برای همین که این کار مد نظرمه
سلام
نوع فایل انتخابیت پایل هستش و امکانی جز خوندن خطی نداره واگه می خوای جستجوی تصادفی داشته باشی باید بری سراغ نوع های دیگه فایل مثل فایل مستقیم یا شاخص یا دودویی

systam
شنبه 30 خرداد 1394, 16:32 عصر
با تشکر از دوستان
من این کد رو تست کردم میاد فقط شماره یک رو برای من نمایش میده
StreamReader sw = new StreamReader(Application.StartupPath + "\\data.txt");
string all = sw.ReadToEnd;
Dim str As String() = all.Split("-")
For i As Integer = 0 To str.Length - 1
ListBox1.Items.Add(str(i))
Next

RmeXXXXXXXXX
شنبه 30 خرداد 1394, 21:32 عصر
اشتباه اینه که میاییم و توی فایل بصورت سریال (پیوسته - خطی) اطلاعات رو ذخیره میکنیم.
sizeof عددی رو برمیگردونه که حجم (تعداد بایت) یک آبجکت می باشه.
الگوریتم برنامه رو به فایل تصادفی تغییر بدین. بدین صورت که:
قرار داد می کنیم که شماره سطر یکتا باشد (آی دی). فرض کنیم کاربر سطر 5 رو انتخاب می کنه. فرض میکنیم حجم رکورد هم 20 باشه. منظورم از حجم رکورد همون خروجی sizeof می باشد.
پس با این شرایط موقعیت قرار گیری رکورد میشه 5*20 = 100. خونه 100 میتونید رکورد رو ذخیره کنید. استریم رو که باز کردین Position رو 100 بذارید و اطلاعات رو ذخیره کنید.
فرض می کنیم در زمان دیگری عدد 5 برای شماره سطر دیگری انتخاب بشه. اینبار با رفتن به خونه 100 و خوندن اطلاعات متوجه رزور بودن سطر شماره 5 میشیم.
بهمین ترتیب ادامه خواهیم داد. برای پیدا شماره سطر بصورت خودکار هم میتونید با ایجاد یک حلقه while و شمارنده از 1 اقدام به انتخاب کردن شماره رزور نشده کرد.
اگه خواستین برنامشو براتون مینویسیم.

TeacherMath
شنبه 30 خرداد 1394, 23:08 عصر
اگه اطالاعات رو توی فایل xml ذخیره کنید خیلی بهتره بعد با توابعی که توی سی شارپ وجود داره می تونید عملیات سرچ رو با linq انجام بدین. نکته بعد اینکه هر فرد رو توی یک سطر ذخیره کنید و برای هر سطر یک شماره ترتیب بزارین و موقع دریافت اطلاعات با linq از xml اونا رو براساس شماره ترتیب مرتب کنید.
بهتره فایل xml به صورت زیر باشه.

<?xml version="1.0" encoding="utf-8"?>
<Persons>
<Person Id="1" Name="" LastName="" >
<Tartib>2</Tartib>
<Code>32356566565</Code>
<Vaziat>مجرد</Vaziat>
</Person>
<Person Id="2" Name="" LastName="" >
<Tartib>1</Tartib>
<Code>32356566565</Code>
<Vaziat>مجرد</Vaziat>
</Person>
<Person Id="3" Name="" LastName="" >
<Tartib>3</Tartib>
<Code>32356566565</Code>
<Vaziat>مجرد</Vaziat>
</Person>
</Persons>

nunegandom
یک شنبه 31 خرداد 1394, 00:23 صبح
عدد جدید رو برابر با pattern مربوط به regexp بگذارید
اعداد رو سطر به سطر بر حسب اولین کاراکتر - جدا کنید و با regex چک کنید به همین سادگی
نمونه کد regex:

using System.Text.RegularExpressions;


List<string> str = new List<string>();
str.Add("1234");
str.Add("123");
str.Add("12345");
string pattern = "^[123]{3}$";
Regex reg = new Regex(pattern);
foreach (var item in str)
{
bool result = reg.IsMatch(item);
if (result)
textBox1.Text += item;
}
قرمز عددی هست که میخوای چک کنی که وجود داره یا خیر!
سبز تعداد ارغام هستش
و این دوتا رو حتما باید برای هر چک عدد جدید، تنظیم کنی که با کد نویسی راحته

systam
یک شنبه 31 خرداد 1394, 14:37 عصر
سلام
ازهمه دوستانی که زحمت کشید راهنمای کردند منونم دستشون درد نکنه
کد رو به این صورت غییر بدیم کلا ستون ردیف به راحتی توی لیست میریزیم و میتونیم مقدار وارد شده رو چک کنیم در لیست باکس
ولی ایم راه درستش نیست
StreamReader sw = new StreamReader(Application.StartupPath + "\\data.txt");
string all = sw.ReadToEnd;
Dim str As String() = all.Split("-")
For i As Integer = 0 To str.Length - 1
ListBox1.Items.Add(str(i))
i=i+3;
Next
به نظر مبرم سراغ xml طبق گفته دوستمون جناب
TeacherMath بهتره
ممنونم
یا علی