Tags:

พึ่งหัดเขียนได้ 3 วัน ครับ พอดีผมอยากแยกข้อมูลใน line ที่ตรงกับข้อมูลใน list ไปไว้อีกไฟล์
แล้วก็ ข้อมูลใน line ที่ไม่ตรงกับข้อมูลใน list ไปไว้อีกไฟล์นึงครับ
ตอนนี้แยก ข้อมูลที่ตรงกับข้อมูลใน list ไปอีกไฟล์ได้แล้ว แต่ส่วนที่เหลือไปไม่เป็นแล้วครับ :)

ตัวอย่างโค๊ดที่เขียนครับ

file_name = "output_file.txt"

tower_emp = ["02721","70015","70041","70029","70059","70065","70111","70081",
"70166","70193","70122","70153","70203","70213","70263","70221"]

tower = "tower.txt"
trading = "trading.txt"

input_file = open(file_name, 'r')
lines = input_file.readlines()
tower_file = open(tower, 'w')
trading_file = open(trading, 'w')

for line in lines:
for i in range(len(tower_emp)):
if tower_emp[i] in line:
tower_data = line
tower_file.write(tower_data)
tower_file.close()

Get latest news from Blognone
By: BLeAm on 22 December 2009 - 21:59 #144741

ไม่แน่ใจว่าผมเข้าใจปัญหาถูกหรือปล่าว(ส่วนนึงเพราะไม่ได้ indent code มาด้วย) แต่เท่าที่ดูจาก code เข้าใจว่าขาดแค่


else:
    trading_data = line
    trading_file.write(trading_data)
    trading_file.close()

ยังไงก็ตามถ้าผมเข้าใจโจทย์และ indent ไม่ผิด flow แบบที่คุณเขียนอาจทำให้เกิดการเขียนข้อมูล line ไปที่ไฟล์ tower_file/trading_file ซ้ำๆ ได้ในกรณีที่มีข้อมูลใน tower_emp ใน line มากกว่าหนึ่งตัว

อีกข้อสังเกตนึงคือโค้ดอาจจะยาวเกินจำเป็นไปนิดนึงหรือปล่าวครับ ผมอ่านโจทย์ดูแล้วลองปรับเป็นตามด้านล่าง(อาจจะสั้นเกินไปเหมือนกัน มาตามอ่านทีหลัง มีโอกาสงง)


tower_emp = ["02721","70015","70041","70029","70059","70065","70111","70081","70166","70193","70122","70153","70203","70213","70263","70221"]
with file('tower.txt','w') as tower:
  with file('trading.txt','w') as trading:
    map(lambda line: [ret for ret in tower_emp if ret in line] and [tower.write(line)] or trading.write(line),file('output_file.txt','r').readlines())

ฝากรบกวนลองเอาไปรันและแจ้งผลนิดนึงนะครับ คือลองปรับแล้วแต่ไม่มีข้อมูลทดสอบ(output_file.txt) อยากรู้ว่ามันเวิร์กหรือปล่าว

By: sapsec on 22 December 2009 - 23:38 #144763

ผมก็คิดว่าโค๊ดยาวเกินจำเป็น อ๊าย อาย แหะๆ แต่อย่างที่บอกครับ พึ่งหัดเขียนได้ วันที่ 3 นี้จริงๆ

ผลที่ได้คือ ข้อมูลที่ trading จะเบิ้ลเท่ากับ จำนวนสมาชิกใน list เลยครับ แล้วก็บรรทัดที่มีข้อมูลตรงกับสมาชิกใน List ก็ยังโผล่ที่ trading.txt ครับ
ตัวอย่างข้อมลใน output_file.txt ครับ (เป็นข้อมูลที่ดึงมาจากกล่อง TAFF เครื่องรูดบัตรครับ)

70111 21/11/2552 1800 01
70153 21/11/2552 1804 01
70081 21/11/2552 1834 01
70213 21/11/2552 1901 01
15916 21/11/2552 0713 10
18841 21/11/2552 0723 10
06385 21/11/2552 0734 10
70081 21/11/2552 0754 10
20826 21/11/2552 0906 10
18841 21/11/2552 1700 10
06385 21/11/2552 1700 10
15916 21/11/2552 1700 10
20826 21/11/2552 1707 10

code

file_name = "output_file.txt"
tower_file = "tower.txt"
trading_file = "trading.txt"
tower_emp = ["02721","70015","70041","70029","70059","70065","70111","70081",
             "70166","70193","70122","70153","70203","70213","70263","70221"]

input_file = open(file_name, 'r')
lines = input_file.readlines()
output_tower_file = open(tower_file, 'w')
output_trading_file = open(trading_file, 'w')
for line in lines:
    for i in range(len(tower_emp)):
        if tower_emp[i] in line:
            tower_data = line
            output_tower_file.write(tower_data)
        else:
            trading_data = line
            output_trading_file.write(trading_data)
output_tower_file.close
By: sapsec on 22 December 2009 - 23:57 #144765

ส่วนโค๊ดที่สุดกระชับตัวล่างที่คุณ BLeAm ให้ผมมาใช้ได้ครับ
ขอบคุณมากเลยครับ :)

By: BLeAm on 23 December 2009 - 17:21 #144926 Reply to:144765

ครับ :)

By: darktong
ContributorAndroidUbuntu
on 23 December 2009 - 14:09 #144839

ผมว่าที่ผิดเพราะคุณวนลูป tower_emp แล้วมาเทียบกับ line ที่วนลูปอยู่อีกทีอะครับ
ถ้าเอา line มาเทียบกับ tower_emp ไปเลย น่าจะดีกว่านะครับ


for line in lines:
    if line.split()[0] in tower_emp:
        output_tower_file.write(line)
    else:
        output_trading_file.write(line)

By: sapsec on 25 December 2009 - 21:23 #145236 Reply to:144839

โอ กระจ่างเลยครับ ขอบคุณมากครับ