ดังนั้นตอนใช้ 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 ตัวนี้เลย
ลองรันทดสอบดู เรียบร้อยครับ ผลลัพธ์ถูกต้อง
๗ ความคิดเห็น:
such a nice post.
thank you krap
สุดยอดมากเลยครับ
ถ้าไม่ได้บทความอันนี้
โปรแกรมที่ผมเขียนก้อคงไม่สมบูรณ์
ขอบคุณมากครับ
้ขอบคุณมากครับผม
โอ๊เล่ ขอบคุณครับผมเองก็เมหือนกันไม่ได้บทความนี้ ตายคาโต๊แน่เลย โฮๆๆๆๆ อยากร้องดังๆ T_T
เจอปัญหาเหมือนกันครับ ดีนะที่เจอบทความนี้ ขอบคุณครับ
ขอบคุณค่ะ
ขอบคุณค่ะ กำลังทำการบ้านอยู่ ^^ มีงานไปส่งแล้ว
แสดงความคิดเห็น