先說CSV格式:
(1)列之間使用逗號分隔
(2)如果單列裏的內容有逗號,則用雙引號括起該列,以區別列分隔符的逗號
今天遇到了一個問題,一個外部的CSV文件要導入的數據庫裏,可是某一列中的一個值包含英文逗號,比如某一列放的是公司英文名稱一般爲*****CO.,LTD,大家知道逗號作爲CSV文件的一個關鍵之,那麼在讀取數據的時候,第一列如果按逗號分隔,那麼相應的內容很容易被截斷。這樣就導致了數據的差異性,那麼怎麼解決這個問題呢?
System.IO.Stream file = Request.Files[0].InputStream;
System.IO.StreamReader reader = new System.IO.StreamReader(file, System.Text.Encoding.GetEncoding("GBK"));
while (!reader.EndOfStream)
{
if (i++ > 2)
{
strMessage = SaveVC(reader.ReadLine());
if (strMessage != "true")
{
Response.Write("<script language=\"javascript\">alert(\"Error!\\n" + strMessage + "\");</script>");
break;
}
}
else
reader.ReadLine();
}
file.Close();
reader.Close();
private string SaveVC(string aData)
{
#region 解決CSV導入內容的逗號關鍵字
string[] DoubleQuotation = aData.Split('"');
if (DoubleQuotation.Length > 0)
{
for (int i = 0; i < DoubleQuotation.Length; i++)
{
if (DoubleQuotation[i].Contains(",") && i % 2 != 0)
{
DoubleQuotation[i] = DoubleQuotation[i].Replace(',', FMECommon.str_split_copyright);
}
}
}
StringBuilder sbStr = new StringBuilder();
for (int i = 0; i < DoubleQuotation.Length; i++)
{
sbStr.Append(DoubleQuotation[i]);
}
string newData = sbStr.ToString();
string[] s = newData.Split(',');
if (s.Length > 0)
{
for (int i = 0; i < s.Length; i++)
{
if (s[i].Contains(FMECommon.str_split_copyright.ToString()))
{
s[i] = s[i].Replace(FMECommon.str_split_copyright,',');
}
}
}
#endregion
string[] ss = s;
}
1.首先逐條讀取CSV文件裏的內容
2.使用Split 函數 首先按照“ 進行拆分
3.對於得到的字符串數組,對於偶數列的元素,替換逗號爲其他字符
4.再合併成新的字符串
5.再次使用Split 函數 首先按照,進行拆分
6.對於得到的字符串數組,替換回逗號