انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: سید وحید رضا برهانی در 10 دی 1387، 04:06 ق‌ظ

عنوان: جست و جو در متن
ارسال شده توسط: سید وحید رضا برهانی در 10 دی 1387، 04:06 ق‌ظ
سلام
من یک کد(سی یا پایتون) می خواستم که بتونه :چند تا فایل متنی بگیره ویک فایل بده بیرون (اینجاش زیاد سخت نیست)حالا این چند تا فایلی رو که گرفت بره توش وشروع کنه به جست و جو به این صورت که کلمه ی اولی (هر کلمه بین دو تا فاصله قرار داره مثل زبان انگیسی به غیر از کلمه ی اولی!)رو در کل فایل های وارد شده دنبال کنه و بشماره و تا آخر روی همه ی کلمات همین کارو انجام بده و در آخر نتیجه ی کارو به صورت کلمه ی جست وجو شده و تعداد ان کلمه در یک فایلی ذخیره کنه تموم شد!!و یک چیز اگر مایل بودید توضیح کوچیکی هم بدید که بعدا" ازش سر در بیارم
ممنون
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: فاراب در 10 دی 1387، 10:44 ب‌ظ
همه‌ی اینها تابع داره. هم در C هم در اسکریپت.
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: سید وحید رضا برهانی در 11 دی 1387، 03:05 ق‌ظ
چه خوب می شه بیشتر بگه یا راهنمایی کنی یا مثال بزنی ؟
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: mtux در 11 دی 1387، 11:55 ق‌ظ
به قول دوستان:
RTFM
و
google it
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: Behnam Golds در 11 دی 1387، 06:06 ب‌ظ
یه نمونه سادشو برات نوشتم اینو نگاه کن ایده بگیر .چون گفتی با چند تا فایل مشکلی نداری این کد رو برای یک فایل ورودی نوشتم.
فرض من بر این بوده که حداکثر تعداد کلمات unique که در فایل استفاده شده 100 تاست. من برای ساختن دیکشنری از فایل استفاده نکردم و فقط یه بافر تعریف کردم اگر خواستی خودت عوضش کن. و حداکثر طول هر خط رو 100 کاراکتر با احتساب کاراکتر خط جدید در نظر گرفتم و  حداکثر طول هر کلمه 25 کاراکتر با احتساب NULL  .  جدا کننده های کلمات هم (n\,. )   یعنی  "نقطه کاما فاصله و کاراکتر خط جدید"
خروجی رو هم فقط روی صفحه نشون میده و توی فایل نریختم.


#include <string.h>
#include <stdio.h>
#define MAX_WORDS 100

void insertUW(char *string);
int searchUW(char *string);
void printUW(void);

int uwc=0;     //Keeps The Number Of Unique Words Already found.(Unique Word Counter)

struct uwss   //Unique Word Status Structure
  {       
   char uw[25];
   int no;
  }uws[MAX_WORDS];

int main(int argc,char *argv[])
  {
     FILE *in;
     if(argc > 1)
         {
            if((in = fopen(argv[1],"r"))==NULL)
               {
                  printf("The file  \"%s\" not found.\n",argv[1]);
                  return 0;
               }
         }
     else
        {
          printf("    Pleas enter a file name.\n");
          printf("    Usage: extract filename\n");
          return 0;
        }
     char string[100]; //Assume the maximum length of a line 100 characters
     const char delimiters[] = " .,\n"; //word delimiters
     char *token;

     while(fgets(string,100,in)!=NULL)
       {
          token = strtok (string, delimiters); 
     
          while(token!=NULL)
            {
               insertUW(token);
               token = strtok (NULL, delimiters);   

            }//end of while
       }//end of while
 
     printUW();
     return 0 ;
  }

void insertUW(char *string)
  {
     int index=searchUW(string);

     strncpy(uws[index].uw,string,25);
     uws[index].no++;
     if(index==uwc)
     uwc++;
  }

int searchUW(char *string)
  {
     int i;

     if(uwc!=0)
        for(i=0;i<uwc;i++)
           if((strncmp(uws[i].uw,string,25))==0)
              return i;//end of if-for-if

     return uwc;
  }

void printUW(void)
  {
     int i,j;

     for(i=0;i<uwc;i++)
        {
           printf("------------------------------------\n");
           printf("%d) %s     ",i+1,uws[i].uw);

           for(j=0;j<(26-strlen(uws[i].uw));j++)
              printf(" ");//end of for

           printf("(%d)\n",uws[i].no);
        }//end of for
  }



نمونه فایل ورودی :
behnam@ubuntu:~/Desktop/fdg$ cat c.txt
ubuntu,linux.ubuntu iran ubuntu linux
     . ..  .. ,, , ,  ubuntu  linux  behnam

behnam iran,linux.

نتیجه :
behnam@ubuntu:~/Desktop/fdg$ ./extract c.txt
------------------------------------
1) ubuntu                         (4)
------------------------------------
2) linux                          (4)
------------------------------------
3) iran                           (2)
------------------------------------
4) behnam                         (2)
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: سید وحید رضا برهانی در 12 دی 1387، 02:04 ق‌ظ
ممنون برم کامپایل کنم ببینم چی می شه
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: Behnam Golds در 12 دی 1387، 09:45 ق‌ظ
خواهش میکنم.منتظر نتیجه هستم.
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: سید وحید رضا برهانی در 14 دی 1387، 04:09 ق‌ظ
سلام یک جاشو نمی فهمم  :اون صده مگه تعداد کلمات متفاوت رو تعیین نمی کنه (پس باید تو نتایجش از 100 کلمه بیشتر نداشته باشه در حالی که در بعضی فایل ها بیشتر میشه؟)و یک چیز دیگه چرا وقتی 100 رو می کنه 300 کلا" خرو جیش بهم می ریزه؟(پیچیده تر از اونی بود که فکر می کردم)
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: Behnam Golds در 14 دی 1387، 04:25 ق‌ظ
خوب برای اینکه من کنترل نکردم که اگر خواست از 100  بیشتر  بشه برنامه چه عکس العملی نشون بده و چون داریم از اشاره گر (همون اسم آرایه)  استفاده می کنیم در محدوده هایی نوشته میشه که مجاز نیست. میتونی با یه if  مقدار uwc  رو با 100  مقایسه کنی و در صورت رسیدن به 100 از حلقه while  بیای بیرون. من 100   رو به 300  هم تغییر دادم ولی مشکلی نبود! دقیق تر توضیح بده و خروجی بذار .
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: سید وحید رضا برهانی در 15 دی 1387، 05:35 ق‌ظ
سلام نمی دونم چرا ولی تو ویندوز کامپایل کردم وهیچ مشکلی نداشت
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: Behnam Golds در 15 دی 1387، 12:07 ب‌ظ
 :o   نمیدونم والا  من تو اوبونتو و سوزه کامپایل کردم مشکلی پیش نیومد...
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: سید وحید رضا برهانی در 16 دی 1387، 02:31 ق‌ظ
سلام این خروجی رو نگاه کن فایل ورودیش سورس برنامه است
http://negarsoft.persiangig.com/q.txt
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: Behnam Golds در 16 دی 1387، 12:03 ب‌ظ
فکر کنم  تفاوت در کد اسکی کاراکتر خط جدید در ویندوز و لینوکس باشه ، خروجی برای من اینطوریه :

1) #include                       (2)
------------------------------------
2) <string                        (1)
------------------------------------
3) h>                             (2)
------------------------------------
4) <stdio                         (1)
------------------------------------
5) #define                        (1)
------------------------------------
6) MAX_WORDS                      (1)
------------------------------------
7) 300                            (1)
------------------------------------
8) void                           (4)
------------------------------------
9) insertUW(char                  (2)
------------------------------------
10) *string);                      (2)
------------------------------------
11) int                            (8)
------------------------------------
12) searchUW(char                  (2)
------------------------------------
13) printUW(void);                 (1)
------------------------------------
14) uwc=0;                         (1)
------------------------------------
15) //Keeps                        (1)
------------------------------------
16) The                            (1)
------------------------------------
17) Number                         (1)
------------------------------------
18) Of                             (1)
------------------------------------
19) Unique                         (1)
------------------------------------
20) Words                          (1)
------------------------------------
21) Already                        (1)
------------------------------------
22) found                          (2)
------------------------------------
23) (Unique                        (1)
------------------------------------
24) Word                           (2)
------------------------------------
25) Counter)                       (1)
------------------------------------
26) struct                         (1)
------------------------------------
27) uwss                           (1)
------------------------------------
28) //Unique                       (1)
------------------------------------
29) Status                         (1)
------------------------------------
30) Structure                      (1)
------------------------------------
31) {                              (11)
------------------------------------
32) char                           (5)
------------------------------------
33) uw[25];                        (1)
------------------------------------
34) no;                            (1)
------------------------------------
35) }uws[MAX_WORDS];               (1)
------------------------------------
36) main(int                       (1)
------------------------------------
37) argc                           (1)
------------------------------------
38) *argv[])                       (1)
------------------------------------
39) FILE                           (1)
------------------------------------
40) *in;                           (1)
------------------------------------
41) if(argc                        (1)
------------------------------------
42) >                              (1)
------------------------------------
43) 1)                             (1)
------------------------------------
44) if((in                         (1)
------------------------------------
45) =                              (4)
------------------------------------
46) fopen(argv[1]                  (1)
------------------------------------
47) "r"))==NULL)                   (1)
------------------------------------
48) printf("The                    (1)
------------------------------------
49) file                           (2)
------------------------------------
50) \"%s\"                         (1)
------------------------------------
51) not                            (1)
------------------------------------
52) \n"                            (1)
------------------------------------
53) argv[1]);                      (1)
------------------------------------
54) return                         (5)
------------------------------------
55) 0;                             (2)
------------------------------------
56) }                              (7)
------------------------------------
57) else                           (1)
------------------------------------
58) printf("                       (3)
------------------------------------
59) Pleas                          (1)
------------------------------------
60) enter                          (1)
------------------------------------
61) a                              (2)
------------------------------------
62) name                           (1)
------------------------------------
63) \n");                          (1)
------------------------------------
64) Usage:                         (1)
------------------------------------
65) extract                        (1)
------------------------------------
66) filename\n");                  (1)
------------------------------------
67) string[100];                   (1)
------------------------------------
68) //Assume                       (1)
------------------------------------
69) the                            (1)
------------------------------------
70) maximum                        (1)
------------------------------------
71) length                         (1)
------------------------------------
72) of                             (6)
------------------------------------
73) line                           (1)
------------------------------------
74) 100                            (2)
------------------------------------
75) characters                     (1)
------------------------------------
76) const                          (1)
------------------------------------
77) delimiters[]                   (1)
------------------------------------
78) "                              (2)
------------------------------------
79) \n";                           (1)
------------------------------------
80) //word                         (1)
------------------------------------
81) delimiters                     (1)
------------------------------------
82) *token;                        (1)
------------------------------------
83) while(fgets(string             (1)
------------------------------------
84) in)!=NULL)                     (1)
------------------------------------
85) token                          (2)
------------------------------------
86) strtok                         (2)
------------------------------------
87) (string                        (1)
------------------------------------
88) delimiters);                   (2)
------------------------------------
89) while(token!=NULL)             (1)
------------------------------------
90) insertUW(token);               (1)
------------------------------------
91) (NULL                          (1)
------------------------------------
92) }//end                         (3)
------------------------------------
93) while                          (2)
------------------------------------
94) printUW();                     (1)
------------------------------------
95) 0                              (1)
------------------------------------
96) ;                              (1)
------------------------------------
97) *string)                       (2)
------------------------------------
98) index=searchUW(string);        (1)
------------------------------------
99) strncpy(uws[index]             (1)
------------------------------------
100) uw                             (2)
------------------------------------
101) string                         (2)
------------------------------------
102) 25);                           (1)
------------------------------------
103) uws[index]                     (1)
------------------------------------
104) no++;                          (1)
------------------------------------
105) if(index==uwc)                 (1)
------------------------------------
106) uwc++;                         (1)
------------------------------------
107) i;                             (1)
------------------------------------
108) if(uwc!=0)                     (1)
------------------------------------
109) for(i=0;i<uwc;i++)             (2)
------------------------------------
110) if((strncmp(uws[i]             (1)
------------------------------------
111) 25))==0)                       (1)
------------------------------------
112) i;//end                        (1)
------------------------------------
113) if-for-if                      (1)
------------------------------------
114) uwc;                           (1)
------------------------------------
115) printUW(void)                  (1)
------------------------------------
116) i                              (1)
------------------------------------
117) j;                             (1)
------------------------------------
118) printf("-----------------      (1)
------------------------------------
119) printf("%d)                    (1)
------------------------------------
120) %s                             (1)
------------------------------------
121) i+1                            (1)
------------------------------------
122) uws[i]                         (2)
------------------------------------
123) uw);                           (1)
------------------------------------
124) for(j=0;j<(26-strlen(uws[      (1)
------------------------------------
125) uw));j++)                      (1)
------------------------------------
126) ");//end                       (1)
------------------------------------
127) for                            (2)
------------------------------------
128) printf("(%d)\n"                (1)
------------------------------------
129) no);                           (1)


میتونی توی گوگل بگردی ، این رو ببین :
http://www.linuxforums.org/forum/misc/112428-new-line-character-windows-linux.html

با notepad  که فایل رو باز میکنی تمام خطوط رو با هم ترکیب میکنه ؟ اگر اینطوریه  فکر کنم با ورد آفیس یا اپن آفیس خودمون بازش کنی اولش یه پیغام برای تبدیل فرمت بهت بده . همونی که چند تا گزینه CR  و CR&LF  و LF  بهت میده. یا اینکه خودت دستی درستش کنی.
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: سید وحید رضا برهانی در 17 دی 1387، 03:50 ق‌ظ
تو ویندوز دزست عمل می کنه فقط در لینوکس مشکل داره(اونم وقتی که عدده از 100 بیشتر می شه)
عنوان: پاسخ به: جست و جو در متن
ارسال شده توسط: Behnam Golds در 17 دی 1387، 04:06 ق‌ظ
این خروجی که گذاشتم رو توی اوبونتو گرفتم و همونطور که میبینی عدد هم از 100 بیشتر شده البته من مقدار ماکزیمم رو به 300 تغییر دادم.  حالا زیاد در بند این کد نباش ، اینو  همینطوری نوشتم که ازش ایده بگیری و کد خودتو بنویسی ، این کد خیلی اشکالات داره حداقل اگر نمیخوای یکی دیگه بنویسی سعی کن همین رو رفع اشکال کنی.و سعی کنی بهینه بکنیش. اگر در مورد منطق برنامه مشکل داشته باشی در خدمتم.