Friday, October 30, 2009 - 文章

CODE-將CSV檔案內容轉換成ADO.NET DataTable物件

寫給同事用的工具函數,隨手貼文分享:

/// <summary>
/// 將CSV內容字串轉成DataTable(全部欄位都視為string,有需要請自行轉換), 不支援""包夾格式
/// </summary>
/// <param name="csvContent">整個CSV的內容</param>
/// <param name="firstRowAsHeader">第一列是否為欄位名稱,若無則以C1, C2自動命名</param>
/// <returns></returns>
public static DataTable ConvertCSVtoDataTable(string csvContent, 
    bool firstRowAsHeader)
{
    DataTable t = new DataTable();
    using (StringReader sr = new StringReader(csvContent))
    {
        string line = null;
        bool colCreated = false;
        while ((line = sr.ReadLine()) != null)
        {
            string[] p = line.Split(',');
            if (!colCreated)
            {
                int idx = 1;
                foreach (string s in p)
                {
                    try
                    {
                        t.Columns.Add(
                            //第一欄是否有欄位名稱? 無則用C1, C2自動編號
                            firstRowAsHeader ? s : "C" + idx.ToString(),
                            typeof(string)
                            );
                    }
                    catch (Exception e1)
                    {
                        throw new ApplicationException(
                            "新增欄位失敗! 欄位名稱=" + s + "\n" + e1.ToString());
                    }
                    idx++;
                }
                colCreated = true;
                //首欄若為欄名,則不當資料處理
                if (firstRowAsHeader) continue;
            }
            try
            {
                t.Rows.Add(p);
            }
            catch (Exception e2)
            {
                throw new ApplicationException("資料匯入失敗!\n資料=" + line + 
                    "\n錯誤訊息:" + e2.ToString());
            }
        }
    }
    return t;
}
 
private static void test()
{
    string csv = "ID,Name,Score\n1,Jeffrey,200\n2,Darkthread,999";
    //Or you can read data from file
    //string csv = System.IO.File.ReadAllText("B:\\mydata.csv");
    DataTable t = ConvertCSVtoDataTable(csv, true);
    Debug.WriteLine("RowCount=" + t.Rows.Count);
    foreach (DataRow r in t.Rows)
        Debug.WriteLine(string.Format("{0}=>{1}", r["Name"], r["Score"]));
    csv = "1,Jeffrey,200\n2,Darkthread,999";
    t = ConvertCSVtoDataTable(csv, false);
    Debug.WriteLine("RowCount=" + t.Rows.Count);
    foreach (DataRow r in t.Rows)
        Debug.WriteLine(string.Format("{0}=>{1}", r["C2"], r["C3"]));
}

搜尋

Go

<October 2009>
SunMonTueWedThuFriSat
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
 
RSS
【工商服務】
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication