【分享】CSV格式文件大普及(附解析示例源码)

NqIceCoffee 2012-10-26 01:30:42
问:CSV是什么?
答:具体来说是一种文本格式,规则如下:
1、开头是不留空,以行为单位。
2、可含或不含列名,含列名则居文件第一行。
3、一行数据不垮行,无空行。
4、以半角逗号(即,)作分隔符,列为空也要表达其存在。
5、列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
6、列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。
7、文件读写时引号,逗号操作规则互逆。
8、内码格式不限,可为 ASCII、Unicode 或者其他。
9、不支持特殊字符

具体参见:http://baike.baidu.com/view/468993.htm

问:那么它有什么用呢?
答:上传文件的最佳格式!

旁白:最佳格式?唬人吧!我用Excel比你那个好多了!
补充:1、Excel支持CSV格式的文件,也就是说能使用微软的Excel编辑CSV格式的文件
在直白点说就是你用Excel的优势,几乎CSV都有
2、目前大多数部署的服务器都是64位的,使用原始的Excel格式的文件就有一个问题,64的机器是没有OLE驱动的
那么,此时如果想使用OLE的驱动,只有2种办法,IIS的应用程序池设置成32位的,或者直接在编译的选项中直接把平台选成X86
当然,有时候我们不想这么做(你要非这么做也没不反对)
此时CSV格式就闪亮登场拉,它是基于文本的,解析不需要驱动,人人都可以轻易的将数据读出来

下面就是我写的解析CSV文件的C#代码,贴一个核心的代码出来(代码上有注释就不详细解释了):

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;
}


你可以在下面的地址下载到全部的示例DEMO:http://download.csdn.net/detail/nqicecoffee/4689667
示例代码仅经过本人的简单测试,可能会有BUG哦,如果你发现了,可以跟帖告诉我,谢谢。
...全文
360 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
段传涛 2012-12-10
  • 打赏
  • 举报
回复
above all. heartfelt thank for you doing this.
蝶恋花雨 2012-12-10
  • 打赏
  • 举报
回复
对日的项目全都是这种。解析 ini csv tmp,xls等。
NqIceCoffee 2012-12-10
  • 打赏
  • 举报
回复
很荣幸啊,SP大神光临 唉,不提了,网上解析CSV和生成CSV的代码一堆堆的 但大多数都不靠谱,有的甚至只简单的做了分隔逗号 所以就自己写了个,不过貌似不能引起大家的兴趣,算鸟 么兴趣分享了
  • 打赏
  • 举报
回复
我建议你写个Excel转换为JArray(是用json.net)的,那才更加是造福于csdn。
寂小魔 2012-12-09
  • 打赏
  • 举报
回复
如果我在导出的csv的时候,用datagridview做数据源,然后有个字段的值的内容有换行,导出后不是在单元格内换行,而是另起一行了呢?后来我用引号把内容包括依旧这样。 后来只能让它输出\r\n了 但是也不在单元格内换行。请问我要怎么做才能让它在单元格内换行?
NqIceCoffee 2012-10-26
  • 打赏
  • 举报
回复
沙发不留,嘎嘎

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧