关于解析.csv文件的一个算法
不知道大家用.csv文件的时候多不,我是第一次用,下面是我写的一个解析算法,效率比较低,欢迎大家指导!
在写算法之前,我先用一个例子说下.csv文件的格式:
自己随便写的一个字符串 aa, bb, cc,"kkk"常常 以","为分割符,
要说明的是 aa 是一列, bb是一列, cc,"kkk"常常 是一列 共三列,
其中第三列比较特殊其中包含一个","和一个" ",
当你用.net从这个.csv文件里读取这个.csv文件的时候,你得到的会是 aa,bb,"cc,""kkk常常""" 规则是如果一列中本身包含"," 这列外边要用" "引起来,如果列本身包含" "要在" "外边要牵套一个" "
下面这个算法就是把读出来的 aa,bb,"cc,""kkk常常""" 还原为aa, bb, cc,"kkk"常常
public string StrConvert(string str)
{
try
{
StringBuilder strBulid = new StringBuilder();
int number1 = 0; //对"计数的变量
int number2 = 0; //这个是对"一个标志位,如果当前字符串为",+1,如果下一个字符串不为",赋值为0
foreach (Char c in str)
{
if (c != '\"' && c != ',')
{
number2 = 0;
strBulid.Append(c);
}
else if (c == ',' && number1 % 2 == 0)
{
strBulid.Append(" ");//把","替换为空格,为了以后用空格进行拆飞(对这个有点疑问我,不知道对不)
number2 = 0;
}
else if (c == ',' && number1 % 2 == 1) //如果","是一列内部不进行替换
{
strBulid.Append(c);
number2 = 0;
}
else if (c == '\"')
{
number2 += 1;
number1 += 1;
if (number2%2==0) //只取""中的第一个
{
strBulid.Append(c);
}
}
}
if (number1 % 2 == 1)
{
Console.WriteLine("源文件有误!");
strBulid = null;
}
return strBulid.ToString();
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
return null;
}
}
在写算法之前,我先用一个例子说下.csv文件的格式:
自己随便写的一个字符串 aa, bb, cc,"kkk"常常 以","为分割符,
要说明的是 aa 是一列, bb是一列, cc,"kkk"常常 是一列 共三列,
其中第三列比较特殊其中包含一个","和一个" ",
当你用.net从这个.csv文件里读取这个.csv文件的时候,你得到的会是 aa,bb,"cc,""kkk常常""" 规则是如果一列中本身包含"," 这列外边要用" "引起来,如果列本身包含" "要在" "外边要牵套一个" "
下面这个算法就是把读出来的 aa,bb,"cc,""kkk常常""" 还原为aa, bb, cc,"kkk"常常
public string StrConvert(string str)
{
try
{
StringBuilder strBulid = new StringBuilder();
int number1 = 0; //对"计数的变量
int number2 = 0; //这个是对"一个标志位,如果当前字符串为",+1,如果下一个字符串不为",赋值为0
foreach (Char c in str)
{
if (c != '\"' && c != ',')
{
number2 = 0;
strBulid.Append(c);
}
else if (c == ',' && number1 % 2 == 0)
{
strBulid.Append(" ");//把","替换为空格,为了以后用空格进行拆飞(对这个有点疑问我,不知道对不)
number2 = 0;
}
else if (c == ',' && number1 % 2 == 1) //如果","是一列内部不进行替换
{
strBulid.Append(c);
number2 = 0;
}
else if (c == '\"')
{
number2 += 1;
number1 += 1;
if (number2%2==0) //只取""中的第一个
{
strBulid.Append(c);
}
}
}
if (number1 % 2 == 1)
{
Console.WriteLine("源文件有误!");
strBulid = null;
}
return strBulid.ToString();
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
return null;
}
}
浙公网安备 33010602011771号