วันอาทิตย์ที่ 25 มกราคม พ.ศ. 2558

การใช้ python cgi สำหรับแสดงตาราง ประมวลผลไฟล์ csv.

                  
       ในการสร้างตารางได้มีการดึงข้อมูลจาก https://docs.google.com/spreadsheets/d/1vjDrnYcWW-ofhsmLVjEYA3yLFWT1ItQF4HmwRpj5JPI/edit#gid=0
         มาเป็นไฟล์ csv

 ตัวอย่างไฟล์ csv แทนที่จะใช้ตารางขั้นจะใช้ , ขั้นระหว่าแถวแทน
           ในที่นี้จะนำไฟล์นี้มาเรียงเลขรหัสนักศึกษา และทำเป็นตารางโดยใช้ cgi 
ตัวอย่างโค้ด
#!/usr/bin/python
#-*-coding: utf-8 -*-
print "content-type :text/html\n\n"
print "<meta http-equiv=Content-Type content=text/html;charset=utf-8 >"

file = "/home/ubuntu/cgi-bin/w1-Mon - Sheet1.csv"
inlist = open(file,'rU').readlines()
box_line = []
box_string = []
put_or_not = 0

for l in inlist[2:len(inlist)-1]:
    for s in l.split(","):
        box_string.append(s)
    num = len(box_string)
    for i in box_string[1].split("-"):
        number = int(i)
        box_string.append(number)
    if len(box_line)==0:
        box_line.append(box_string)
        put_or_not =1
    else :
        for n_box in box_line:
            if(n_box[num]>box_string[num]):
                box_line.insert(box_line.index(n_box),box_string)
                put_or_not =1
                break;
            elif(n_box[num]==box_string[num]):
                if(n_box[num+2]>box_string[num+2]):
                    box_line.insert(box_line.index(n_box),box_string)
                    put_or_not =1
                    break;
                if(n_box[num+2]==box_string[num+2]):
                    if(n_box[num+3]>box_string[num+3]):
                        box_line.insert(box_line.index(n_box),box_string)
                        put_or_not =1
                        break;   
    if(put_or_not ==0):               
        box_line.append(box_string)
    put_or_not = 0       
    box_string = []

print "<table border=1 width=60%>"
print "<tr align=center>"
print "<td width=20%>"+"Student ID"+"</td>"
print "<td width=20%>"+"Name"+"</td>"
print "<td width=20%>"+"Surname"+"</td>"
print "<td width=30%>"+"Blog url"+"</td>"
print "<td width=10%>"+"Counted number w1-Mon"+"</td>"
print "</tr>"
for a in box_line:
    print "<tr>"
    print "<td width=20%>"+a[1]+"</td>"
    print "<td width=20%>"+a[2]+"</td>"
    print "<td width=20%>"+a[3]+"</td>"
    print "<td width=30%> <a href=http://"+a[4]+">"+a[4]+"</a href></td>"
    print "<td width=10% align=center>"+a[0]+"</td>"
    print "</tr>"
print "</table>"

ผล


อธิบายการทำงาน
            การใช้งาน cgi จะต้องประกาศ #!/usr/bin/python และ print "content-type :text/html\n\n" และเนื่องจากข้อมูลที่ดึงเข้ามามีภาษาไทยทำให้ต้องประกาศ #-*-coding: utf-8 -*- เพื่อให้ python อ่านภาษาไทยได้ และ print "<meta http-equiv=Content-Type content=text/html;charset=utf-8 >" ให้ html รู้ภาษาไทย
            ใช้การดึงข้อมูลด้วย
             inlist = open(file,'rU').readlines()
             โดยใช้การ open เพื่อเปิดไฟล์ที่ต้องการ และใช้ readline เพื่อแยกทีละบรรทัดมาเก็บไว้ใน inlist
             for l in inlist[2:len(inlist)-1]:
             และทำการวน เพื่ออ่านทีละบรรทัด โดยแต่ละบรรทัดเก็บที่ l ในที่นี้จะไม่อ่านสองบรรทัดแรก
              for s in l.split(","):
                box_string.append(s)
               เมื่ออ่านทีละบรรทัด แต่ละแถวจะมี , ขึ้นอยู่จึงใช้ split ตัดแบ่งทีละช่องเก็บไว่ใน  list ที่เรียกว่า box_string 
                for i in box_string[1].split("-"):
                   number = int(i)
                   box_string.append(number)
                 แล้วใช้การตัดคำ - จากรหัสนักศึกษาเพื่อนนำไปใช้ไปใช้ในการจัดเรียงแถวรหัสนักศึกษา
                 if len(box_line)==0:
        box_line.append(box_string)
        put_or_not =1
    else :
        for n_box in box_line:
            if(n_box[num]>box_string[num]):
                box_line.insert(box_line.index(n_box),box_string)
                put_or_not =1
                break;
            elif(n_box[num]==box_string[num]):
                if(n_box[num+2]>box_string[num+2]):
                    box_line.insert(box_line.index(n_box),box_string)
                    put_or_not =1
                    break;
                if(n_box[num+2]==box_string[num+2]):
                    if(n_box[num+3]>box_string[num+3]):
                        box_line.insert(box_line.index(n_box),box_string)
                        put_or_not =1
                        break;   
    if(put_or_not ==0):               
        box_line.append(box_string)
    put_or_not = 0       
    box_string = []
               ในส่วนนี้จะใช้การจัดเรียง ทีละแถว โดยเปรียบเทียบรหัสปีแรก หากเหมือนกันก็เทียบจากรหัส 5 ตัวสุดท้าย มาเก็บไว้ใน list ชื่อbox_line.
               print "<table border=1 width=60%>"
print "<tr align=center>"
print "<td width=20%>"+"Student ID"+"</td>"
print "<td width=20%>"+"Name"+"</td>"
print "<td width=20%>"+"Surname"+"</td>"
print "<td width=30%>"+"Blog url"+"</td>"
print "<td width=10%>"+"Counted number w1-Mon"+"</td>"
print "</tr>"
for a in box_line:
    print "<tr>"
    print "<td width=20%>"+a[1]+"</td>"
    print "<td width=20%>"+a[2]+"</td>"
    print "<td width=20%>"+a[3]+"</td>"
    print "<td width=30%> <a href=http://"+a[4]+">"+a[4]+"</a href></td>"
    print "<td width=10% align=center>"+a[0]+"</td>"
    print "</tr>"
print "</table>"
             ในส่วนนี้จะเป็นการสร้าง ตารางสำหรับแสดงข้อมูล
รูปแบบของ html ในการสร้างตารางคือประกาศ <table>
และแต่ละแถวจะอยู่ใน  <tr> และจะเรียงไปแต่ละคอลัมม์ใน <td> โดยในส่วนนั้นจะสามารถกำหนด ความกว้างได้จาก width

ไม่มีความคิดเห็น:

แสดงความคิดเห็น