CSV文件解析到DataTable

详细代码如下:


  1 public class CsvParsingHelper
2 {
3 /// <summary>
4 /// 将csv文件的数据转成datatable
5 /// </summary>
6 /// <param name="csvfilePath">csv文件路径</param>
7 /// <param name="firstIsRowHead">是否将第一行作为字段名</param>
8 /// <returns></returns>
9 public static DataTable CsvToDataTable(string csvfilePath, bool firstIsRowHead)
10 {
11 DataTable dtResult = null;
12 if (File.Exists(csvfilePath))
13 {
14 string csvstr = File.ReadAllText(csvfilePath, Encoding.Default);
15 if (!string.IsNullOrEmpty(csvstr))
16 {
17 dtResult = ToDataTable(csvstr, firstIsRowHead);
18 }
19 }
20 return dtResult;
21 }
22
23 /// <summary>
24 /// 将CSV数据转换为DataTable
25 /// </summary>
26 /// <param name="csv">包含以","分隔的CSV数据的字符串</param>
27 /// <param name="isRowHead">是否将第一行作为字段名</param>
28 /// <returns></returns>
29 private static DataTable ToDataTable(string csv, bool isRowHead)
30 {
31 DataTable dt = null;
32 if (!string.IsNullOrEmpty(csv))
33 {
34 dt = new DataTable();
35 string[] csvRows = csv.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
36 string[] csvColumns = null;
37 if (csvRows != null)
38 {
39 if (csvRows.Length > 0)
40 {
41 //第一行作为字段名,添加第一行记录并删除csvRows中的第一行数据
42 if (isRowHead)
43 {
44 csvColumns = FromCsvLine(csvRows[0]);
45 csvRows[0] = null;
46 for (int i = 0; i < csvColumns.Length; i++)
47 {
48 dt.Columns.Add(csvColumns[i]);
49 }
50 }
51
52 for (int i = 0; i < csvRows.Length; i++)
53 {
54 if (csvRows[i] != null)
55 {
56 csvColumns = FromCsvLine(csvRows[i]);
57 //检查列数是否足够,不足则补充
58 if (dt.Columns.Count < csvColumns.Length)
59 {
60 int columnCount = csvColumns.Length - dt.Columns.Count;
61 for (int c = 0; c < columnCount; c++)
62 {
63 dt.Columns.Add();
64 }
65 }
66 dt.Rows.Add(csvColumns);
67 }
68 }
69 }
70 }
71 }
72
73 return dt;
74 }
75 /// <summary>
76 /// 解析一行CSV数据
77 /// </summary>
78 /// <param name="csv">csv数据行</param>
79 /// <returns></returns>
80 public static string[] FromCsvLine(string csv)
81 {
82 List<string> csvLiAsc = new List<string>();
83 List<string> csvLiDesc = new List<string>();
84
85 if (!string.IsNullOrEmpty(csv))
86 {
87 //顺序查找
88 int lastIndex = 0;
89 int quotCount = 0;
90 //剩余的字符串
91 string lstr = string.Empty;
92 for (int i = 0; i < csv.Length; i++)
93 {
94 if (csv[i] == ‘"‘)
95 {
96 quotCount++;
97 }
98 else if (csv[i] == ‘,‘ && quotCount % 2 == 0)
99 {
100 csvLiAsc.Add(ReplaceQuote(csv.Substring(lastIndex, i - lastIndex)));
101 lastIndex = i + 1;
102 }
103 if (i == csv.Length - 1 && lastIndex < csv.Length)
104 {
105 lstr = csv.Substring(lastIndex, i - lastIndex + 1);
106 }
107 }
108 if (!string.IsNullOrEmpty(lstr))
109 {
110 //倒序查找
111 lastIndex = 0;
112 quotCount = 0;
113 string revStr = Reverse(lstr);
114 for (int i = 0; i < revStr.Length; i++)
115 {
116 if (revStr[i] == ‘"‘)
117 {
118 quotCount++;
119 }
120 else if (revStr[i] == ‘,‘ && quotCount % 2 == 0)
121 {
122 csvLiDesc.Add(ReplaceQuote(Reverse(revStr.Substring(lastIndex, i - lastIndex))));
123 lastIndex = i + 1;
124 }
125 if (i == revStr.Length - 1 && lastIndex < revStr.Length)
126 {
127 csvLiDesc.Add(ReplaceQuote(Reverse(revStr.Substring(lastIndex, i - lastIndex + 1))));
128 lastIndex = i + 1;
129 }
130
131 }
132 string[] tmpStrs = csvLiDesc.ToArray();
133 Array.Reverse(tmpStrs);
134 csvLiAsc.AddRange(tmpStrs);
135 }
136 }
137
138 return csvLiAsc.ToArray();
139 }
140 /// <summary>
141 /// 反转字符串
142 /// </summary>
143 /// <param name="str"></param>
144 /// <returns></returns>
145 private static string Reverse(string str)
146 {
147 string revStr = string.Empty;
148 foreach (char chr in str)
149 {
150 revStr = chr.ToString() + revStr;
151 }
152 return revStr;
153 }
154 /// <summary>
155 /// 替换CSV中的双引号转义符为正常双引号,并去掉左右双引号
156 /// </summary>
157 /// <param name="csvValue">csv格式的数据</param>
158 /// <returns></returns>
159 private static string ReplaceQuote(string csvValue)
160 {
161 string rtnStr = csvValue;
162 if (!string.IsNullOrEmpty(csvValue))
163 {
164 //首尾都是"
165 Match m = Regex.Match(csvValue, "^\"(.*?)\"$");
166 if (m.Success)
167 {
168 rtnStr = m.Result("${1}").Replace("\"\"", "\"");
169 }
170 else
171 {
172 rtnStr = rtnStr.Replace("\"\"", "\"");
173 }
174 }
175 return rtnStr;
176
177 }
178 }

CSV文件解析到DataTable,布布扣,bubuko.com

时间: 2024-12-25 22:06:53

CSV文件解析到DataTable的相关文章

Cocos数据篇[3.4](5) ——CSV文件解析

[唠叨] 在一个游戏中,通常会有很多怪物.关卡.技能等数据,这些数据不可能在代码里写死,一般都会使用配置文件保存,使用时再加载到内存. CSV文件编辑起来十分简单,所以常常用来配置游戏的数据信息. 本文要介绍的是:如何读取CSV文件格式的数据. [扩展阅读] http://baike.baidu.com/subview/468993/5926031.htm (CSV百度百科) http://blog.csdn.net/stevenkylelee/article/details/38309147 

CSV文件解析

CSV(逗号分隔值文件格式) 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据.CSV文件由任意数目的记录组成,记录间以某种换行符分隔:每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符.通常,所有记录都有完全相同的字段序列.CSV文件格式的通用标准并不存在,但是在RFC 4180中有基

EXCEL与CSV文件解析工具

package com.common.util; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.

iOS-解析读取CSV文件,解析excel文件

项目中可能会遇到数据库中导出CSV格式数据,类似于如下图: 需要将csv数据导入进程序中使用,或者写入本地数据库文件中. *什么是CSV? CSV,即逗号分隔值(Comma-Separated Values).有时也称为字符分隔值,因为分隔字符也可以不是逗号,可以是分号;),其文件以纯文本形式存储表格数据(数字和文本). 这种文件格式经常用来作为不同程序之间的数据交互的格式. CSV格式数据的结构类似表格,不同的记录占用一行,一行中的字段用","(逗号)分隔. 在xcode中, csv

解析 csv文件 java &gt;&gt;&gt;&gt;&gt;最爱那水货

1 /** 2 * csv文件解析 <br> 3 * wx 微信明细数据 第1行是标题 ,最后2行 是总结 提取数据需要过滤<br> 4 * zfb 支付宝明细数据 前4行 和最后4行是总结 第5行是 标题 提取数据时需要过滤 5 * @param localPath 本地文件绝对路径 6 * @param flag 支付机构 wx zfb pos 7 * @return 8 */ 9 public List<String[]> csvAnalysis(String l

自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 更有开发效率地使用CSV文件 为了更有效率地使用CSV文件,我制作了一个工具:Code代码生成器. 这个工具可以对CSV文件进行简单地配置,自动生成这个CSV文件对应的C++数据结构和字段类型解析函数代码. 工程项目只要加入这些自动生成的代码,就可以更方便地使用来自CSV配置文件的数据. 用工具自动生代码,可以省去了手工编写.手工维护那些大量的.无聊繁琐的类型定义.数据转换的代码的过

C#操作CSV文件类实例

本文实例讲述了C#操作CSV文件类.分享给大家供大家参考.具体分析如下: 这个C#类用于转换DataTable为CSV文件.CSV文件转换成DataTable,如果需要进行CSV和DataTable之间进行转换,使用这个类非常合适. using System.Data; using System.IO; namespace DotNet.Utilities { /// <summary> /// CSV文件转换类 /// </summary> public static class

将DataTable转换成CSV文件

DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记.CSV文件是个纯文本文件,每一行表示一张图片的许多属性. 在.net项目中运用C#将DataTable转化为CSV文件,现在提供一个较为通用的方法,具体代码如下:         /// <summary>         /// 将DataTable转换成CSV文件         /// &

练习:读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中.

/** *    读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中. *    1, 土鳖, 13101015338, 北京海淀区 2, 咪咪, 13201015338, 北京朝阳区 3, 小仓, 13601015818, 北京宣武区 4, 饭岛爱, 13201025818, 北京朝阳区 /** * 读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中. * 1, 土鳖, 13101015338, 北京海淀区 2, 咪咪, 13201015