1. 程式人生 > >對包含逗號、引號的CSV字串的解析函式

對包含逗號、引號的CSV字串的解析函式

csv檔案一般格式為:

A,B,C

1,2,3

4,5,6

但是當檔案記憶體儲有逗號、引號,如果只是用split(",")會導致在存在逗號的情況下出錯。

如:

A,B,C

1,“2,2",3

4,"""5",6

以下函式輸入:

            string ll = @"4,""""""5"",6,""2,3""";//從excel中檢視的資料顯示 4|"5|6|2,3,儲存的字串為4,"""5",6,"2,3"
            string[] a = CSVstrToAry(ll);

 輸出:

           a[0]:4

           a[1]:”5

           a[2]:6

           a[3]:2,3

函式如下:

        private static string[] CSVstrToAry(string strLine)
        {
            string strItem = string.Empty;
            int semicolonFlg = 0;//單數時肯定不是某一列的結束位置
            List<string> lstStr = new List<string>();
            string strA = string.Empty;

            for (int i = 0; i < strLine.Length; i++)
            {
                strA = strLine.Substring(i, 1);

                if (strA == "\"") semicolonFlg += 1;

                if (semicolonFlg == 2) semicolonFlg = 0;

                if (strA == "," && semicolonFlg == 0)
                {
                    if (strItem.Contains("\""))
                    {
                        strItem = strItem.Replace("\"\"", @"""");//CSV中引號也會有轉義,單引號會轉換為雙引號
                        if (strItem.StartsWith("\"")
                            && strItem.EndsWith("\""))
                        {
                            strItem = strItem.Substring(1, strItem.Length - 2);
                        }
                    }
                    
                    lstStr.Add(strItem);
                    strItem = string.Empty;
                }
                else
                {
                    strItem += strA;
                }
            }

            if (strItem.Length > 0)
            {
                if (strItem.Contains("\""))
                {
                    strItem = strItem.Replace("\"\"", @"""");//CSV中引號也會有轉義,單引號會轉換為雙引號
                    if (strItem.StartsWith("\"")
                        && strItem.EndsWith("\""))
                    {
                        strItem = strItem.Substring(1, strItem.Length - 2);
                    }
                }
                lstStr.Add(strItem);
            }

            return lstStr.ToArray();
        }