先说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.对于得到的字符串数组,替换回逗号