ورود

View Full Version : کلاس تبدیل جداول html به datatable



hariva
چهارشنبه 14 شهریور 1386, 00:51 صبح
هدف این تاپیک ساخت کلاسی است که بتواند اطلاعات یک جدول html را به یک datatable تبدیل کند.انجام چنین کاری با اکسس بسیار راحت است اما اگر بخواهیم محتوای صفحات وب را پردازش کنیم وجود چنین کلاسی واقعا ضروری است.من با جستجوی این سایت نتیجه ای نگرفتم و در سایت های خارجی هم چیز بدر بخوری نیافتم.نتیجه اینکه تصمیم گرفتم که آنرا بصورت پروژه در اینجا به کمک سایر دوستان اجرا کنم چون در نهایت حاصل آن برای همه میتواند کاربردی باشد.

کارها را من تقسیم بندی کرده ام تا هرکس هر بخشی را دوست دارد انجام دهد.

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

ابتدا پروپرتی html که از نوع string است به کلاس داده میشود.html شامل کد های html صفحه ی وب است.

پس از این کار تابع proccess بکار می افتد.

تابع proccess متن html را جستجو کرده و تمام جدول های موجود در آن را پیدا میکند. و اطلاعات مربوط به جداول را داخل متغیر آرایه ای tablelist قرار میدهد.این مشخصه ها شامل نام جدول مکان شروع جدول در html وطول آن و همچنین تعداد سطر و ستون و تعداد رکورد های آن میشود.

تابع پروسس همچنین یک مقدار عددی به متغیر tableCount میدهد که نشان دهنده ی تعداد جدول یافته شده در متن html است.

قسمت بعدی کلاس یک تابع است که با فرض اینکه tableCount نشان دهنده ی وجود حداقل یک جدول در متن کار میکند. این تابع Table2DataTableنام دارد و وضیفه اش تبدیل جدول به دیتاتیبل است .این تابع در دو حالت کار میکند .
در حالت اول با دادن ایندکس جدول مورد نظر سایر اطلاعات را از tablelist میگیرد.

در حالت دوم بطور مجزا با دادن نام متن و نقطه شروع و طول جدول خروجی اش دیتا تیبل است.

دلیل این دو گونه کارکرد این است که بتوان بطور مستقیم از این تابع در برنامه ها استفاده کرد.مثلا وقتی بطور متناوب ما اطلاعاتی را از یک صفحه ی وب در میآوریم لازم نیست همیشه آنرا پردازش کنیم.

شاد باشید





Public Class htmltable2DataTable

Public Property html() As String
Get


End Get
Set(ByVal Value As String)
proccess(Value)
End Set
End Property

Public TableCount As Integer
Public TableList(,) As String
'tablelist(,0)= table start index in html
'tablelist(,1)= table lenght in html
'tablelist(,2)= field count
'tablelist(,3)= record count


Dim position As Integer
Dim TableStart As Integer
Dim TableEnd As Integer
Dim FirstTable As Boolean

Dim i As Integer
Dim j As Integer


Public Function proccess(ByVal html As String)

position = 1
FirstTable = True
TableCount = 0


'find start of table
TableStart = InStr(position, html, "<table")

If TableStart > 0 Then

'find end of table
TableEnd = InStr(TableStart, html, "</table>")
position = TableEnd

If TableEnd > TableStart Then
'ERR

Else

If FirstTable = True Then
FirstTable = False
ReDim tablelist(1, 3)
Else
ReDim Preserve tablelist(UBound(tablelist) + 1, 3)
End If


'table start index in html
tablelist(UBound(tablelist), 0) = TableStart

'table lenght in html
tablelist(UBound(tablelist), 1) = TableEnd - TableStart + 7

'field count in one row
tablelist(UBound(tablelist), 2) = HowManyInStr(Mid(html, TableStart, InStr(TableStart, html, "</tr>") - TableStart + 4), "</td>") / 2

'record count
tablelist(UBound(tablelist), 3) = HowManyInStr(Mid(html, TableStart, TableEnd - TableStart + 7), "</tr>") / 2


TableCount = TableCount + 1


End If

End If



End Function
Private Function HowManyInStr(ByVal str As String, ByVal find As String) As Integer


End Function

Public Function Table2DataTable(ByVal TableIdx As Integer) As DataTable

Dim dr As DataRow
position = TableList(TableIdx, 0) 'table start index in html

For i = 0 To TableList(TableIdx, 3) 'record count


position = InStr(position, html, "</tr>")

Next

End Function


Public Function Table2DataTable(ByVal html As String, ByVal start As Integer, ByVal lenght As Integer) As DataTable



End Function

Public Function Text2Row(ByVal str As String, ByVal Before As String, ByVal after As String) As DataRow

'str=<td>alireza</td> <td>ebrahimi</td> <td>1342</td>
'Before=<td>
'After=</td>

End Function

End Class

hariva
چهارشنبه 14 شهریور 1386, 23:02 عصر
از قرار معلوم باید خودم اقدام کنم تا بقیه هم به شوق بیایند.به هر حال این کلاس خیلی کاربردی است و بیشترین استفاده ی آن در آوردن اطلاعات صفحات وب میباشد و میتواند در ساخت موتور های جستجوی محتوا کاربرد داشته باشد.کارهایی دیگری هم میشود با آن کرد که بسته به نیاز برنامه نویس دارد.بطور مثال در تحلیل محتوای سایت های اطلاع رسانی خبری


کارهایی که امروز من انجام دادم این کارها بود

تابع proccess که وظیفه ی بررسی متن html را دارد ساخته شده است.البته هنوز آزمایش نشده است.


کارهایی که نیاز است انجام شود.

چک کردن کد های من جهت بهینه سازی آنها

ساخت تابع Text2Row که یک متن را به یک DataRow تبدیل میکند.روش کار آن هم اینست که با توجه به متغیر های متنی Before و After متن بین دو متغیر Before و After را به ترتیب در فیلد های DataRow قرار میدهد.


ساخت تابع HowManyInStr که وظیفه اش شمردن تعداد find در متن str است.
در ضمن کد ها را در کامنت اول بروز شده است.

Behrouz_Rad
چهارشنبه 14 شهریور 1386, 23:36 عصر
شما با Regular Expression خیلی راحت میتونی این کار رو انجام بدیاااااااااااا
حجم کدهات تقریبا یک سوم میشه!

موفق باشی.

hariva
پنج شنبه 15 شهریور 1386, 00:46 صبح
شما با Regular Expression خیلی راحت میتونی این کار رو انجام بدیاااااااااااا
حجم کدهات تقریبا یک سوم میشه!

موفق باشی.

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