正确解析以逗号分割的CSV文件

///

1<summary>   
2/// 解析/// </summary>

///

1<param name="Source"/>

csv字符串
///

1<returns></returns>

public ArrayList SplitCSV(string csvStr)
{

//获取联系人记录内容
#region
int sp = csvStr.IndexOf("\r\n");

string head = csvStr.Substring(0, sp - 1);

string record = csvStr.Substring(sp + 2);
#endregion

char[] s = record.ToCharArray();

System.Text.StringBuilder strCol = new System.Text.StringBuilder();
ArrayList arLne = new ArrayList();
ArrayList arAll = new ArrayList();
int cnter = 0; //双引号计数器

for ( int i = 0 ; i < s.Length ; i++)
{
if ( s[i] == '"') //遇到双引号(字段结束符)
{
cnter++; //计数器加一
strCol.Append(s[i]); //此引号加入当前列
}
else if ( s[i] == ',') //遇到逗号(列结束符)
{
if (IsColumeOver(cnter)) //此逗号是列结束符,计数器清零,将当前列加入当前行
{
cnter = 0;
arLne.Add(strCol);
strCol = new System.Text.StringBuilder();
}
else //此逗号不是列结束符,逗号加入当前列
{
strCol.Append(s[i]);
}
}
else if (s[i] == '\r') //遇到回车(行结束符)
{
if (IsLineOver(cnter)) //此回车是行结束符,计数器清零,将当前行加入结果数组
{
cnter = 0;
arAll .Add(arLne);
arLne = new ArrayList();
}
else //此回车不是行结束符,\r回车符加入当前列
{
strCol.Append(s[i]);
}
}
else //正常数据(非字段、列、行结束符)
{
strCol.Append(s[i]);
}
}

return arAll ;
}

///

1<summary>   
2/// 当前列是否已读完   
3/// </summary>

///

1<param name="cnter"/>

///

1<returns></returns>

private bool IsColumeOver(double cnter)
{
return System.Math.IEEERemainder((double)cnter,2) == 0;
}

///

1<summary>   
2/// 当前行是否已读完   
3/// </summary>

///

1<param name="cnter"/>

///

1<returns></returns>

private bool IsLineOver(double cnter)
{
return System.Math.IEEERemainder((double)cnter,2) == 0;
}

Published At
Categories with Web编程
Tagged with
comments powered by Disqus