C#Csv实现基本的读写和转换DataTable
短信预约 -IT技能 免费直播动态提醒
Csv文件基本的属性
csv文件可以在excel或者wps中以表格形式打开,本质上是每一列以,
逗号为分隔符的一种格式,在C#中操作可以把他当做普通txt文本读入,然后通过处理,
逗号分隔符来对数据进行处理转换。
在表格中打开:
在记事本中打开:
Csv读写方式
方式一:一次性读写
使用File.ReadAllLines
一次性读入。File.WriteAllLines
一次性写入。
这种方式适合csv文件内容不多的情况下使用。
示例:
string path="data.csv";
var lines = File.ReadAllLines(path).ToList();
完整的实现:
/// <summary>
/// 读取Csv,返回行集合
/// </summary>
/// <param name="path"></param>
/// <param name="hasTitle"></param>
/// <returns></returns>
public static List<string> ReadCsv(string path, bool hasTitle)
{
if (!File.Exists(path))
return new List<string>();
var lines = File.ReadAllLines(path).ToList();
if (hasTitle)
{
lines.RemoveAt(0);
}
return lines;
}
方式二:使用文件流形式读写
使用StreamReader
,一行一行的读取文件中的内容,并且处理。写入类似
示例:
using (StreamReader sr = new StreamReader(path))
{
string line;
while ((line = sr.ReadLine()) != null)
{
//处理行数据
}
}
Csv文件读写DataTable类型
将CSV文件读入数据转成DataTable类型
/// <summary>
/// 读取Csv文件,加载到DataTable
/// </summary>
/// <param name="path">csv文件路径</param>
/// <param name="hasTitle">是否有标题行</param>
/// <param name="SafeLevel">安全等级:0:错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
/// <returns></returns>
public static DataTable ReadCsvToDataTable(string path, bool hasTitle = false, int SafeLevel = 0)
{
DataTable dt = new DataTable();
var lines = ReadCsv(path, false);
bool isFirst = true;
foreach (var item in lines)
{
string[] values = item.Split(',');
if (isFirst)
{
for (int i = 0; i < values.Length; i++)
{
dt.Columns.Add();
}
if (hasTitle)
{
for (int i = 0; i < values.Length; i++)
{
dt.Columns[i].ColumnName = values[i];
}
continue;
}
isFirst = false;
}
if (values.Length == dt.Columns.Count)
{
dt.Rows.Add(values);
}
else
{
switch (SafeLevel)
{
case 0:
if (values.Length > dt.Columns.Count)
{
var res = values.ToList();
res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count);
dt.Rows.Add(res.ToArray());
}
else
{
dt.Rows.Add(values);
}
break;
case 1:
continue;
default:
throw new Exception("CSV格式错误:表格各行列数不一致");
}
}
}
return dt;
}
/// <summary>
/// 以文件流形式读取Csv文件,加载到DataTable
/// </summary>
/// <param name="path">csv文件路径</param>
/// <param name="hasTitle">是否有标题行</param>
/// <param name="SafeLevel">安全等级:0:错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static DataTable ReadCsvByStream(string path, bool hasTitle = false, int SafeLevel = 0)
{
DataTable dt = new DataTable();
bool isFirst = true;
using (StreamReader sr = new StreamReader(path))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] values = line.Split(',');
if (isFirst)
{
for (int i = 0; i < values.Length; i++)
{
dt.Columns.Add();
}
isFirst = false;
}
//有表头则添加
if (hasTitle)
{
for (int i = 0; i < values.Length; i++)
{
dt.Columns[i].ColumnName = values[i];
}
hasTitle = false;
}
else
{
if (values.Length == dt.Columns.Count)
{
dt.Rows.Add(values);
}
else
{
switch (SafeLevel)
{
case 0:
if (values.Length > dt.Columns.Count)
{
var res = values.ToList();
res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count);
dt.Rows.Add(res.ToArray());
}
else
{
dt.Rows.Add(values);
}
break;
case 1:
continue;
default:
throw new Exception("CSV格式错误:表格各行列数不一致");
}
}
}
}
}
return dt;
}
将DataTable类型写入到Csv文件中去
/// <summary>
/// 以文件流形式将DataTable写入csv文件
/// </summary>
/// <param name="dt"></param>
/// <param name="path"></param>
/// <param name="hasTitle"></param>
/// <returns></returns>
public static bool WriteToCsvByDataTable(DataTable dt, string path, bool hasTitle = false)
{
using (StreamWriter sw = new StreamWriter(path))
{
//输出标题行(如果有)
if (hasTitle)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
sw.Write(dt.Columns[i].ColumnName);
if (i != dt.Columns.Count - 1)
{
sw.Write(",");
}
}
sw.WriteLine();
}
//输出文件内容
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
sw.Write(dt.Rows[i][j].ToString());
if (j != dt.Columns.Count - 1)
{
sw.Write(",");
}
}
sw.WriteLine();
}
}
return true;
}
到此这篇关于C# Csv实现基本的读写和转换DataTable的文章就介绍到这了,更多相关C# Csv读写和转换DataTable内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341