สวัสดีตัวผมเองและชาวโลกฮะ

ต่อจาก EP ที่แล้ว คราวนี้ เราจะมาลงมือสร้างโปรแกรมง่ายๆสักตัวนึงนะฮะ

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

เริ่มต้นจากตัวโปรแกรม Talend ฮะ

ส่วนประกอบหลักของโปรแกรม

ด้านซ้ายเรียกว่า Repository เป็นคลังแสงของ job และองค์ประกอบของ job เช่น โค้ดโปรแกรมเพิ่มเติม หรือรูปแบบชุดข้อมูล (Metadata, Schema) ฮะ

ส่วนด้านขวาเป็น Palette แสดงรายการ component ที่เราหยิบเอาไปใช้ได้ฮะ

ด้านล่างเป็น Property หรือรายละเอียดของแต่ละส่วนฮะ ได้แก่

  • Property – Job แสดงวันที่สร้าง เปลี่ยนแปลง job มีเลข version ด้วย
  • Property – Context แสดงรายการตัวแปรที่มีใช้ใน job นั้นๆ​ ฮะ
  • Property – Component แสดงการตั้งค่าของแต่ละ component ฮะ เปลี่ยนแปลงไปตาม component ที่เราเลือก
  • Property – Run เอาไว้สั่งรันโปรแกรมที่เราออกแบบเอาไว้ฮะ

ลองมาทำโจทย์กัน

จากโจทย์ข้างบน คือ เรามีแฟ้มนึง ในแฟ้มนั้นมีไฟล์ CSV อยู่ 10 ไฟล์ แล้วทีนี้เราอยากจะรวมข้อมูลของทั้งสิบไฟล์นั้น มาเป็นไฟล์เดียวแล้ววางที่อีกแฟ้มนึง จะทำยังไงดี

จากโจทย์ เราจะลองมาเขียนขั้นตอนของโปรแกรมได้ทำนองนี้นะฮะ

ทีนี้ฮะ 1 component คือ 1 step นะฮะ จากรูปข้างบน แปลว่าเราต้องใช้อย่างน้อย 2 component ถูกมั้ยฮะ นั่นคือ component ใช้อ่านไฟล์สิบไฟล์ กับอีกตัวใช้เขียนไฟล์หนึ่งไฟล์

นี่ฮะ เราใช้ tFileInputDelimited เพื่ออ่านไฟล์ CSV 1 ไฟล์กับ tFileOutputDelimited สำหรับเขียนไฟล์ CSV 1 ไฟล์ ฮะ

ต่อมาเราก็ต้องกำหนดให้สองตัวเนี่ยมันเชื่อมต่อกัน จะได้อ่านและเขียนข้อมูลเป็นเส้นเดียวกันฮะ เราก็คลิกขวา เลือก Row > Main หมายความว่า ข้อมูลที่ออกมาจาก tFileInputDelimited จะส่งไปยัง tFileOutputDelimited แบบหนึ่งแถวต่อหนึ่งแถวเลยฮะ

เราได้ต้นทางหนึ่งไฟล์กับปลายทางหนึ่งไฟล์แล้วนะฮะ ต่อไปเราก็มาดูว่าต้องเปลี่ยนแปลงข้อมูลยังไงบ้าง โจทย์บอกว่าแค่รวมสิบไฟล์เป็นไฟล์เดียว ดังนั้นไม่ต้องแก้ไขอะไร แต่ยังไง พื้นฐานโปรแกรมนี้ เราต้องกำหนด Schema ฮะ สมมติว่าไฟล์เรามีสองคอลัมน์ ได้แก่ ชื่อ กับนามสกุลนะฮะ

กดสามจุดที่หลัง Edit schema แล้วจะมีอีกหน้าต่างโผล่ขึ้นมาฮะ แล้วกดเครื่องหมายบวก ใส่ข้อมูลดังนี้ฮะ

  • first_name คอลัมน์แรกของไฟล์ฮะ เป็นชื่อ กำหนดเป็น String (ข้อความ)
  • last_name คอลัมน์ที่สอง เป็นนามสกุล กำหนดเป็น String เหมือนกันฮะ

อย่าลืมกำหนดให้เหมือนกันทั้งไฟล์ต้นทาง tFileInputDelimited และไฟล์ปลายทาง tFileOutputDelimited นะฮะ ไม่งั้นจะเกิด error (สามารถกดปุ่ม Sync column ได้นะฮะ)

หลังจากนั้น ให้ระบุชื่อไฟล์ลงไป เป็นแค่ไฟล์เดียวนะฮะ เพราะ component นี้ใช้อ่านไฟล์เพียงไฟล์เดียว ทีนี้ เราต้องการให้อ่านทั้งแฟ้มเลยนี่ ทำยังไง ก็ใช้อีกตัว คือ tFileList ฮะ เอาไว้อ่านที่อยู่ของไฟล์ทุกอันที่อยู่ในแฟ้มที่ต้องการ

เราก็ระบุไปว่า ให้อ่านไฟล์จากแฟ้มไหนฮะ จากรูปข้างล่างคือ ผมสร้างไฟล์ CSV เตรียมเอาไว้ 10 ไฟล์เนอะ

จากนั้น เราก็เชื่อม tFileList กับ tFileInputDelimited ด้วย Row > Iterate ฮะ เพราะเราต้องทยอยทำแต่ละรอบ (iteration) เพื่ออ่านแต่ละไฟล์ เอาข้อมูลนั้นไปเขียนที่ไฟล์ปลายทางฮะ

ตัว tFileList จะเข้าไปอ่านว่ามีไฟล์อะไรบ้างในแฟ้มที่ตรงกับความต้องการของเรา แล้วพ่นออกมาในตัวแปรที่ชื่อ CURRENT_FILEPATH ฮะ เราก็จะเอาตัวแปรนี้ไปกำหนดใน tFileInputDelimited เพื่อให้มันอ่านไฟล์แต่ละไฟล์ฮะ (สามารถกดให้มันเด้ง autocomplete ออกมาได้นะฮะ) อ้อ อย่าลืมกำหนด Separator ของ tFileInputDelimited เป็น comma ด้วยนะฮะ เพราะ CSV มักจะใช้ comma คั่นแต่ละค่าของข้อมูลฮะ

ด้วยความที่เราต้องการให้ข้อมูลสิบไฟล์ตั้งต้นของเรา ไหลไปเพิ่มที่ไฟล์ปลายทาง อย่าลืมกำหนด Append ที่ tFileOutputDelimited นะฮะ ไม่งั้นมันจะเขียนทับไปเรื่อยๆ ทำให้ท้ายสุดจะมีแค่ข้อมูลไฟล์สุดท้ายของต้นทาง ที่อยู่ที่ไฟล์ปลายทางฮะ แล้วเราก็สามารถกำหนดให้มีหัวคอลัมน์ได้ด้วยการติ๊ก Include Header ฮะ

หลังจากนั้นเราก็กำหนดชื่อไฟล์ปลายทางให้เรียบร้อย แล้วมาลองรันโปรแกรมของเราดูฮะ กดที่ Tab: Run กดปุ่ม Run โปรแกรมก็ทำงานตามที่เราออกแบบไว้ดังรูปข้างล่างเลยฮะ

ได้ไฟล์สุดท้ายแบบนี้เลย

เสร็จแล้วฮะ ไม่ยากใช่มั้ยล่ะ ครั้งหน้าเราจะมาดูกันว่าจะทำยังไงให้โปรแกรมมันสามารถรันได้ตามเวลาที่กำหนดฮะ

บาย~