อ่าน CSV format โดยใช้ Dynamic Objects

CSV – Comma-Separated Value (Variable) คือ Text File ชนิดหนึ่งที่มีโครงสร้างแน่นอน สำหรับเก็บข้อมูลแบบตาราง โดยใช้จุลภาค (เครื่องหมายลูกน้ำ ‘,’ ) เป็นตัวแบ่งข้อมูล ในแต่ละคอลัมน์ และ เว้นบรรทัด เพื่อขึ้น row ใหม่ หรือข้อมูลแถวใหม่

ตัวอย่าง CSV จาก file Foods.csv ข้อมูลอาหารบางส่วนของร้านอาหารแห่งหนึ่ง

Name,Group,Nationality
ต้มยำกุ้ง ข้น/ใส,ต้มยำ ซุป,ไทย
ยำถั่วพลูกุ้งสด,ยำ,ไทย
ปลากะพงนึ่งมะนาว,ปลากะพง,จีน
ปูเนื้อผัดผงกะหรี่,ปูเนื้อ,จีน
ยำสาหร่าย,อาหารว่าง,ญี่ปุ่น
หมึกยักษ์ซาซิมิ,อาหารว่าง,ญี่ปุ่น

บรรทัดแรกแสดงชื่อ column และแถวต่อมาแสดงแถวข้อมูล ทั้งหมด 6 แถว

สร้าง class CsvDataContainer สำหรับอ่าน CSV file ใดๆของเราได้ดังนี้

 using System.Dynamic;

public class CsvDataContainer
{
private class CsvRow : DynamicObject
{
private List<Tuple<string, string>> values = new List<Tuple<string, string>>();
public CsvRow(IEnumerable<string> headers, IEnumerable<string> items)
{
values.AddRange(headers.Zip(items,(header, value) => Tuple.Create(header, value)));
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var answer = values.FirstOrDefault(n => n.Item1 == binder.Name);
result = answer.Item2;
return result != null;
}
}

private List<string> columnNames = new List<string>();
private List<CsvRow> data = new List<CsvRow>();
public CsvDataContainer(System.IO.TextReader stream)
{
// read headers:
var headers = stream.ReadLine();
columnNames = (from header in headers.Split(‘,’) select header.Trim()).ToList();
var line = stream.ReadLine();
while (line != null)
{
var items = line.Split(‘,’);
data.Add(new CsvRow(columnNames, items));
line = stream.ReadLine();
}
}
public dynamic this[int index]{get { return data[index]; }}
public IEnumerable<dynamic> Rows{get { return data; }}
}

ทดสอบ CsvDataContainer

[TestMethod]
public void TestCsvDataContainerByReadSimpleFoodsCSVFile()
{

TextReader stream = File.OpenText(@”Foods.csv”);

var csv = new CsvDataContainer(stream);
foreach (var row in csv.Rows)
{
Console.WriteLine(“Name: {0} – Group: {1} – Nationality: {2}”
, row.Name, row.Group, row.Nationality);
}
}

เสร็จแล้วครับ นี่ก็เป็นการประยุกต์ใช้ Dynamic Programming ซึ่งเป็น feature ใหม่ใน C#.NET 4 มาช่วยลด code และ ทำให้ code อ่านง่ายขึ้นได้(อีกเยอะ)

ขอขอบคุณ Code จาก: Item 44 ใน Effective C# 50 Specific Ways to Improve Your C# Second Edition by Bill Wagner

ขอบคุณครับ 🙂

เขียนน้อยสุด ให้ผลมากสุด

— Chav.P —

Advertisements

#net, #c