วันศุกร์ที่ ๑๔ สิงหาคม พ.ศ. ๒๕๕๒

VB.NET อ่านข้อมูลภาษาไทยจากไฟล์

วันก่อนมีโอกาสเขียนโปรแกรมสำหรับทำการอ่านข้อมูลจาก text file แล้วตัดเอาข้อมูลไปเก็บใน database เพื่อประมวลผล จริงๆก็ไม่ยากครับ แต่ปรากฏว่าข้อมูลภาษาไทยมันกลายเป็นอักษรต่างดาว สาเหตุก็คือ text file ที่ว่าเป็น daily report ที่ได้จากการ export มาจากโปรแกรม POS (Point of Sale) และมันถูก encode ด้วย ANSI (ASCII) ไม่ใช่เป็น UNICODE พอเขียน VB.NET สั่งอ่านไฟล์ตรงๆมันเลย encode ไม่ถูกครับ เพราะว่า .NET ใช้ Unicode (UTF-16) เป็น default encoder

ดังนั้นตอนใช้ StreamReader ก็กำหนด Encode ไปด้วยแค่นี้เอง (งมตั้งนาน - จริงๆแล้วพอคิดไม่ออก เลยไปเล่นเกมส์ พอเล่นเสร็จ ง่วงแล้วก็เลยรีบนอน 5555) ทีนี้ก็มีให้เลือกว่าจะใช้ Windows-874 หรือว่า TIS-620 ผมก็เลือกใช้ Windows-874 เพราะว่า text file โดน export มาจากโปรแกรมที่เขียนบน Windows ซึ่งเขียนมานานพอสมควร ดังนั้นก็เลยเลือกใช้ Windows-874 ซะเลย (ยังไม่ได้ลอง TIS-620 เลย เพราะขี้เกียจ)

ลองดูโค้ดกัน ผมสร้าง Singleton Class ชื่อ DBImportManager ขึ้นมา มี Sub อยู่ 1 ตัว สังเกตุว่ามี BackGroundWorker เป็นพารามิเตอร์ด้วย


Public Sub ImportData(ByVal bk As System.ComponentModel.BackgroundWorker, ByVal fileName As String, ByVal fileImporter As IFileImporter)

If Not FileIO.FileSystem.FileExists(fileName) Then Exit Sub
Dim iLines As Integer
Try
Dim fs As New System.IO.StreamReader(fileName, System.Text.Encoding.GetEncoding(874))
Do While Not fs.EndOfStream
fileImporter.ParseLine(fs.ReadLine)
bk.ReportProgress(10, "Reading: " & iLines)
Loop
fileImporter.Update()
Catch exIO As IO.IOException
bk.ReportProgress(0, exIO.Message)
Catch ex As Exception
bk.ReportProgress(0, ex.Message)
End Try

End Sub


และพารามิเตอร์ตัวสุดท้ายก็เป็น IFlieImporter เนื่องจากว่าเรามีไฟล์หลายตัวที่ต้องทำการ import ข้อมูล ซึ่งแต่ละไฟล์ก็จะมีเงื่อนไขในการตัดไม่เหมือนกัน ผมเลยสร้าง Interface ตัวนี้ขึ้นมาครับ และก็ไปสร้าง FileImporter สำหรับไฟล์แต่ละแบบ เช่น รายงานประจำวัน รายงานลูกค้าใหม่ รายงานรับสินค้าเข้า ฯลฯ ดังนั้นเวลาเปลี่ยน logic ในการตัดไฟล์ เราก็ไปทำการแก้ไขเฉพาะ FileImporter Class ที่เราสร้างขึ้น โดยจะไม่กระทบกับ Class ตัวนี้เลย

ลองรันทดสอบดู เรียบร้อยครับ ผลลัพธ์ถูกต้อง

๗ ความคิดเห็น:

NBK กล่าวว่า...

such a nice post.
thank you krap

ไม่ระบุชื่อ กล่าวว่า...

สุดยอดมากเลยครับ
ถ้าไม่ได้บทความอันนี้
โปรแกรมที่ผมเขียนก้อคงไม่สมบูรณ์
ขอบคุณมากครับ

ไม่ระบุชื่อ กล่าวว่า...

้ขอบคุณมากครับผม

โฮๆๆๆ กล่าวว่า...

โอ๊เล่ ขอบคุณครับผมเองก็เมหือนกันไม่ได้บทความนี้ ตายคาโต๊แน่เลย โฮๆๆๆๆ อยากร้องดังๆ T_T

ไม่ระบุชื่อ กล่าวว่า...

เจอปัญหาเหมือนกันครับ ดีนะที่เจอบทความนี้ ขอบคุณครับ

ไม่ระบุชื่อ กล่าวว่า...

ขอบคุณค่ะ

Unknown กล่าวว่า...

ขอบคุณค่ะ กำลังทำการบ้านอยู่ ^^ มีงานไปส่งแล้ว