C#获取CSV文件内容对逗号和引号分隔的处理
来源:互联网 发布:中国知乎 编辑:程序博客网 时间:2024/06/02 16:19
在小批量数据导入的时候,最常用的就是使用excel工具,将数据保存为xls或csv文件,然后上传到服务器,然后读取出来通过数据库访问类的相关方法更新到数据库中。对于如何读取xls文件的方法,网上太多了,使用excel对象或ole db/odbc连接都行。对于csv文件,其中有一种方式就是通过文件流,将它作为文本读取出来,这其中会遇到一点小意外。
我们知道,使用excel工具保存成csv文件时有几个规则:
1、每一行的单元格内容之间用逗号分隔。
2、如果单元格的内容本身有逗号,这个单元格的内容将会用引号包含。
3、如果单元格的内容本身有引号,
引号不在首或尾,这个单元格内容不会被引号包含。
引号在首或尾,这个单元格内容会被引号包含且原来首尾的引号会被转义。
所以对于这样的内容,直接按逗号或引号使用split方法明显不合适,需要预先处理一下。办法很多,最容易想到的就是用正则过滤掉本身带逗号或引号的内容,剩下的再按逗号split就方便了,我将csv文件中的每一行获取出来存放到一个键值对的集合中,为了保证前后顺序一致,使用SortedList,这里用控制台程序示例一下:
1 string s = string.Empty;
2 string src = string.Empty;
3 SortedList sl = new SortedList();
4 StreamReader fs = new StreamReader(new FileStream("demo.csv", FileMode.Open, FileAccess.Read), Encoding.GetEncoding("gb2312"));
5 while (!string.IsNullOrEmpty(s = fs.ReadLine()))
6 {
7 if (!string.IsNullOrEmpty(s))
8 {
9 Console.WriteLine(s);
10 src = s.Replace("\"\"", "'");
11 MatchCollection col = Regex.Matches(src, ",\"([^\"]+)\",", RegexOptions.ExplicitCapture);
12 IEnumerator ie = col.GetEnumerator();
13 while (ie.MoveNext())
14 {
15 string patn = ie.Current.ToString();
16 int key = src.Substring(0, src.IndexOf(patn)).Split(',').Length;
17 if (!sl.ContainsKey(key))
18 {
19 sl.Add(key, patn.Trim(new char[] { ',', '"' }).Replace("'", "\""));
20 src = src.Replace(patn, ",,");
21 }
22 }
23
24 string[] arr = src.Split(',');
25 for (int i = 0; i < arr.Length; i++)
26 {
27 if (!sl.ContainsKey(i))
28 sl.Add(i, arr[i]);
29 }
30
31 IDictionaryEnumerator ienum = sl.GetEnumerator();
32 while (ienum.MoveNext())
33 {
34 Console.WriteLine(string.Format("{0}:{1}", ienum.Key, ienum.Value.ToString().Replace("'", "\"")));
35 }
36 sl.Clear();
37 src = string.Empty;
38 }
39 Console.Read();
40 }
41 fs.Close();
2 string src = string.Empty;
3 SortedList sl = new SortedList();
4 StreamReader fs = new StreamReader(new FileStream("demo.csv", FileMode.Open, FileAccess.Read), Encoding.GetEncoding("gb2312"));
5 while (!string.IsNullOrEmpty(s = fs.ReadLine()))
6 {
7 if (!string.IsNullOrEmpty(s))
8 {
9 Console.WriteLine(s);
10 src = s.Replace("\"\"", "'");
11 MatchCollection col = Regex.Matches(src, ",\"([^\"]+)\",", RegexOptions.ExplicitCapture);
12 IEnumerator ie = col.GetEnumerator();
13 while (ie.MoveNext())
14 {
15 string patn = ie.Current.ToString();
16 int key = src.Substring(0, src.IndexOf(patn)).Split(',').Length;
17 if (!sl.ContainsKey(key))
18 {
19 sl.Add(key, patn.Trim(new char[] { ',', '"' }).Replace("'", "\""));
20 src = src.Replace(patn, ",,");
21 }
22 }
23
24 string[] arr = src.Split(',');
25 for (int i = 0; i < arr.Length; i++)
26 {
27 if (!sl.ContainsKey(i))
28 sl.Add(i, arr[i]);
29 }
30
31 IDictionaryEnumerator ienum = sl.GetEnumerator();
32 while (ienum.MoveNext())
33 {
34 Console.WriteLine(string.Format("{0}:{1}", ienum.Key, ienum.Value.ToString().Replace("'", "\"")));
35 }
36 sl.Clear();
37 src = string.Empty;
38 }
39 Console.Read();
40 }
41 fs.Close();
0 0
- C#获取CSV文件内容对逗号和引号分隔的处理
- C#获取CSV文件内容对逗号和引号分隔的处理
- 获取csv文件对逗号和引号的处理
- C#对.CSV格式的文件--逗号分隔值文件 的读写操作及上传ftp服务器操作方法总结
- Mysql导出逗号分隔的csv文件
- CSV(逗号分隔)、文本文件(制表符分隔) 等文件的读取
- 对包含逗号、引号的CSV字符串的解析函数
- CSV逗号分隔值文件
- 基于Java的CSV格式文件处理(excel逗号分隔符文件)
- 逗号分隔的值--CSV
- 利用Apache Common CSV读用逗号分隔的文件
- excel表格另存为CSV文件时,如何使每个单元内容都带双引号和逗号分隔
- CSV逗号分隔符文件解析
- 生成csv文件时内容中包含逗号的处理方式
- java读取csv文件内容(逗号分隔、回车换行文本)
- 匹配逗号分隔的内容
- csv格式的文件上传下载时,逗号列的处理
- 对CSV文件和XML文件的处理
- Java程序员的6个级别
- 快速幂取余
- android 布局文件的权重问题
- SqlServer 2012 FileTable 文件表
- Error Code: 1318. Incorrect number of arguments for PROCEDURE company.new_procedure; expected 2, got
- C#获取CSV文件内容对逗号和引号分隔的处理
- scala 函数学习
- 表中含有重复键,连接会产生很大的记录
- Android的GridView和ScrollView的嵌套
- zerglurker的C语言教程004——指针初步讲解
- UVA 10891 Game of Sum 区间dp
- Netty-一个简单的服务器
- 软件测试人员的修行新篇
- 数字图像处理—图像滤波(中值滤波)