Feb 25 2009

วิธีการใช้ regular expression เพื่อ parse ไฟล์ข้อความใน C#

Category: .NETm3rLinEz @ 20:51

เขียนมาหลายครั้งแล้วไม่เคยจำซักที T_T เอามาลงไว้เตือนความจำซักหน่อย

หน้าตาของบรรทัดใน Text File มันคั่นด้วย Space หลายตัวติดกัน ใช้ string.Split(‘ ‘) อาจจะไม่เวิร์คเท่าไหร่ เพราะจะได้ empty string ติดมาด้วย

:
1.0000000e+000  2.4924448e+000  2.6646541e+000  ..
1.0000000e+000 -2.6678309e+000 -1.0957386e+000  ..
1.0000000e+000 -2.6132891e+000 -1.6032095e+000  ..
:

ส่วนอันนี้เป็นโค้ดสำหรับ parse ตัดมาเฉพาะใจความสำคัญ

                 string line;
                int count = 0;
                Regex regex = new Regex("[0-9e+-.]+");
                while (count < maxLines && (line = tr.ReadLine()) != null)
                {
                    int type = -1;
                    List<double> values = new List<double>();
                    MatchCollection matches = regex.Matches(line);
                    foreach (Match m in matches)
                    {
                        double d = double.Parse(m.Groups[0].Value);
                        if (type == -1) type = (int)d;
                        else values.Add(d);
                    }
                    count++;

                    Entry e = new Entry()
                    {
                        Type = type,
                        Data = values.ToArray()
                    };

                    list.Add(e);
                }

Tags: ,

Comments

1.
กร กร says:

ขอเป็นภาษาซีด้วยได้มั้ย

2.
m3rlinez m3rlinez says:

เอาจริงเด่วจัดให้ Smile

3.
chakrit chakrit says:

Split มันมี Overload ที่เอา entry ว่างออกให้เองนะ

Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);

จริงๆ ใช้ LINQ ไม่ง่ายกว่ารึ ใช้ Regex ดูเว่อมาก

4.
m3rlinez m3rlinez says:

@chakrit แฮะๆ เพิ่งจะรู้เรื่อง overload ตัวนั้นครับ ปล่อยไก่เลย
ส่วน LINQ to Text files ยังไม่เคยลอง เมื่อกี้ไปแอบดูมาคร่าวๆแล้ว ดูใช้ง่ายน่าดู
Accept ครับ แต่ที่นี่ไม่มี reputation score ให้นะ Tong

Comments are closed