62,046
社区成员
发帖
与我相关
我的任务
分享
private List<string> ReadLineData(string line)
{
if (string.IsNullOrEmpty(line))
throw new ArgumentNullException("line");
List<string> list = new List<string>();
//避免以,号开头引起死循环
while (line.StartsWith(","))
{
list.Add(string.Empty);
line = line.Substring(1);
}
//如果全是,号,直接返回数据
if (string.IsNullOrEmpty(line))
{
list.Add(string.Empty);
return list;
}
bool is_end = false;
int p = 0, p_comma = 0, p_quotation = 0;
while ((p_comma = GetNextPosition(line, p)) != -1)
{
p_quotation = line.IndexOf('"', p);
if (p_quotation == -1 || p_quotation > p_comma) //,号之前不存在"号
{
list.Add(ReadFieldData(line, p, p_comma));
p = p_comma;
}
else //如果,号之前有"号,需要找到结束的,号
{
int counter = 0; //"号的计数器
while (true)
{
while ((p_quotation = line.IndexOf('"', p_quotation + 1)) != -1)
{
counter++;
if (p_quotation > p_comma)
break;
}
if (counter % 2 == 1)
{
p_comma = GetNextPosition(line, p_comma);
if (p_comma == -1)
{
is_end = true; //如果最终找不到结束的,号那么就是此数据行的结束
break;
}
}
else //如果在,号之前的"号是偶数,那么本次的,号就是结束
{
list.Add(ReadFieldData(line, p, p_comma));
p = p_comma;
break;
}
}
}
//如果已经结束,则跳出循环
if (is_end) break;
}
//收尾
if (p < line.Length)
list.Add(ReadFieldData(line, p, line.Length));
return list;
}