Copyright © 2003-2010
By Suthep Sangvirotjanaphat
  Mobile: 089-967-2200, 081-915-7816
Phone: 0-2992-4877   Fax: 0-2992-4878
Fast Contact Us

GreatFriends.Biz Community

Custom Search
 MESSAGE #13914 (อ่าน 6,906 ครั้ง)

Function สำหรับการอ่าน text file แก้ปัญหาที่มักจะกลายเป็น ???

Function นี้จะแก้ปัญหาเรื่องการอ่าน Text File ที่มี Encode ที่แตกต่างกันกับ Windows ซึ่งเวลาเราอ่านมาแล้วมักจะเป็น อักษระ มนุษย์อวกาศ หรือไม่ก็ไปออก จีน ญี่ปุ่น แขก ??? ไปนั่น 

อย่าลืม Reference
System.Text
System.IO


ตอนเรียกใช้ก็ ง่าย ๆ ครับ แค่ส่ง Path + FileName เข้าไปครับ

[C#]
textBox1.Text = textFileReader("c:\test.txt");
[VB]
textBox1.Text = textFileReader("c:\test.txt")





[C# CODE]                                                                                                                                       

public string textFileReader(string pathFileName)

{

    string line;

    StreamReader fs;

    try{

        fs = new StreamReader(pathFileName);

        line = fs.ReadToEnd();

        /* อ่าน Encode จาก String ที่อ่านมาได้จาก text file */

        Encoding encodeSource = Encoding.GetEncoding(fs.CurrentEncoding.CodePage);

        fs.Close();

        //* ............ */

        Encoding systemEncode = Encoding.Default;

        Encoding targetEncode = encodeSource;

        /* สั่ง getbyte array จาก string ที่เราอ่านมา */

        byte[] srcData = systemEncode.GetBytes( line );

        byte[] dstData;

        /* ถ้าเป้น Encode ต่างกัน windows และ text file ให้ Convert byte array ไปเป็น windows encode */

        if( targetEncode != systemEncode )

            dstData = Encoding.Convert( systemEncode, targetEncode, srcData );

        else

            dstData = srcData;       

        /* convert bytearray ไปเป็น string ด้วย windows encode */

        return targetEncode.GetString(dstData);

    }catch(Exception ex){

        throw new IOException("cannot find " + pathFileName,ex);

    }

 

}



[VB.NET CODE]                                                                                                                                 

Public Function textFileReader(ByVal pathFileName As String) As String

    Dim line As String

    Dim fs As StreamReader

    Try

        fs = New StreamReader(pathFileName)

        line = fs.ReadToEnd

        '/* อ่าน Encode จาก String ที่อ่านมาได้จาก text file */

        Dim encodeSource As Encoding = Encoding.GetEncoding(fs.CurrentEncoding.CodePage)

        fs.Close()

        Dim systemEncode As Encoding = Encoding.Default

        Dim targetEncode As Encoding = encodeSource

        '/* สั่ง getbyte array จาก string ที่เราอ่านมา */

        Dim srcData As Byte() = systemEncode.GetBytes(line)

        Dim dstData As Byte()

        '/* ถ้าเป้น Encode ต่างกัน windows และ text file ให้ Convert byte array ไปเป็น windows encode */

        If (targetEncode.CodePage <> systemEncode.CodePage) Then

            dstData = Encoding.Convert(systemEncode, targetEncode, srcData)

        Else

            dstData = srcData

        End If

        Return targetEncode.GetString(dstData)

    Catch ex As Exception

        Throw New IOException("cannot find " & pathFileName, ex)

    End Try

End Function

 



Nine (นาย) วันที่ส่ง: 4 ม.ค. 49 01:54 GMT+7
วันที่ปรับล่าสุด: 5 ม.ค. 49 01:05 GMT+7
REPLY #1 (13919)
ขอแก้ Comment หน่อย ทั้ง VB C# เลยนะครับ

        /* ถ้าเป้น Encode ต่างกัน windows และ text file ให้ Convert byte array ไปเป็น Text file encode */

        if( targetEncode != systemEncode )

  ........

        /*เป็น string ด้วย Text file encode */

        return targetEncode.GetString(dstData);



Nine (นาย) วันที่ส่ง: 4 ม.ค. 49 04:06 GMT+7
วันที่ปรับล่าสุด: 4 ม.ค. 49 04:06 GMT+7
REPLY #2 (13920)
อธิบาย

เนื่องจากตอนอ่าน Text File เข้ามาเราไม่ระบุ  Encode Type ตาม Code ด้านบน

เพราะเราต้องการจะ Encode โดยใช้ CodePage จาก Text File
ที่ได้อ่านเข้ามาใน StreamReader เพื่อให้ได้ผลลัพธ์ที่ถูกต้อง
โดยไม่ต้อง Fix ไว้ใน code ว่าเป็น Encode ชนิดไหน

สาเหตุ
1. เพราะถ้า Text File ได้ Encode เป็น UTF8 แต่เราสั่งตอน Read text file ใช้ ASCII Encode ผลที่ได้คือ ????
2. แต่ถ้า Text File ได้ Encode เป็น ASCII แต่เราไปใช้ UTF8 Encode  ก็จะได้ ภาษาจีน ญี่ปุ่นและแขก ฯลฯ
3. หรือถ้าเราจะใช้ Encode.Default ก็อาจจะผิดได้ เพราะ Windows อาจจะไม่ได้ Encode ตรงกับ TextFile ซึ่งก็จะอาจได้ผลลัพธ์ เหมือน 2 ข้อแรก


จึงได้ทดลองเขียน Function นี้ขึ้นมาใช้งาน คงยังไม่สมบูรณ์นัก แต่ก็ได้ทดลองแล้วว่า ทำงานได้ดีครับผม

Reference http://msdn.microsoft.com


Nine (นาย) วันที่ส่ง: 4 ม.ค. 49 04:18 GMT+7
วันที่ปรับล่าสุด: 4 ม.ค. 49 04:18 GMT+7
REPLY #3 (13934)
แฮะ ๆ รู้สึกจะหน้าแตก  ซะละ

คือ จะมาบอกว่า 
หลังจากทดลอง โดยใช้ ASCII Text File กลับ Encode ออกมาเป็น ตัวอักษรที่ไม่ใช่ภาษาไทย
เนื่องจากสำคัญที่การอ่าน Text File เข้ามาครั้งแรก เพราะจะทำการ Encode ณ ตรงนั้น
หาก Encode เข้ามาผิด จะ Convert กลับไปนั้นขั้นตอนยุ่งยากครับ

ดังนั้น ให้มองสำคัญที่ OS ขณะนั้นว่าใช้ CodePage (Encode) อะไรอยู่
แม้ Text File จะสร้างด้วย Encode อะไรมาก็ตาม
แต่ตอนอ่านมาแสดงผลนั้นต้องให้เป็น Encode ตัวเดียวกับ OS ที่ใช้อยู่ครับ
ถึงจะได้ผลลัพธ์ที่ถูกต้อง

ขออภัยมา ณ ที่นี่ด้วย ToT

Code กันง่าย ๆ แค่นี้ครับ 

    StreamReader fs = new StreamReader("TextFile.txt", System.Text.Encode.Dedault);





แนะนำ Class
ผมลองหลายวิธีจนได้ Class นึงมา คือ System.Text.Regex
ผมใช้ตรวจว่ามันเป็นภาษาไทยหรือป่าวหลังจากที่ Encode มาได้ โดยวิธีนี้ครับ

Regex rexLine = new Regex("[ก-ฮ]");

rexLine.IsMatch("ชุดสตริงที่ต้องการตรวจ") จะพบอักษร ก-ฮ ก็จะ Return ture ออกมาครับ
rexLine.IsMatch("This String for check") ไม่พบอักษร ก-ฮ ก็จะ Return flase ออกมาครับ

Reference สอน Regular Expression เป็น PHP แต่หลักการเดียวกันครับ
http://www.thaijobmarket.com/regularex.html



Nine (นาย) วันที่ส่ง: 5 ม.ค. 49 01:05 GMT+7
วันที่ปรับล่าสุด: 5 ม.ค. 49 01:05 GMT+7
กระทู้นี้มีอายุเกิน 365 วันแล้ว ท่านจะไม่สามารถตอบกระทู้นี้ได้อีก
ถ้าต้องการสนทนาต่อ กรุณาตั้งเป็นกระทู้ใหม่ได้ในหน้าโฮม
และอาจจะอ้างถึงกระทู้นี้ โดยก๊อปปี้ข้อความในกล่องสีขาวด้านล่างไปแปะในกระทู้ใหม่

copy เพื่ออ้างอิงถึงข้อความนี้:
Function สำหรับการอ่าน text file แก้ปัญหาที่มักจะกลายเป็น ???
http://greatfriends.biz?13914


24 เม.ย. 18:52
Online: 120