目录
- Csv文件基本的属性
- Csv读写方式
- 方式一:一次性读写
- 方式二:使用文件流形式读写
- Csv文件读写DataTable类型
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();
}
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">安全等级::错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
/// <returns></returns>
public static DataTable ReadCsvToDataTable(string path, bool hasTitle = false, int SafeLevel =)
{
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 =; i < values.Length; i++)
{
dt.Columns.Add();
}
if (hasTitle)
{
for (int i =; 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:
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:
continue;
default:
throw new Exception("CSV格式错误:表格各行列数不一致");
}
}
}
return dt;
}
/// <summary>
/// 以文件流形式读取Csv文件,加载到DataTable
/// </summary>
/// <param name="path">csv文件路径</param>
/// <param name="hasTitle">是否有标题行</param>
/// <param name="SafeLevel">安全等级::错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static DataTable ReadCsvByStream(string path, bool hasTitle = false, int SafeLevel =)
{
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 =; i < values.Length; i++)
{
dt.Columns.Add();
}
isFirst = false;
}
//有表头则添加
if (hasTitle)
{
for (int i =; 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:
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:
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 =; i < dt.Columns.Count; i++)
{
sw.Write(dt.Columns[i].ColumnName);
if (i != dt.Columns.Count -)
{
sw.Write(",");
}
}
sw.WriteLine();
}
//输出文件内容
for (int i =; i < dt.Rows.Count; i++)
{
for (int j =; j < dt.Columns.Count; j++)
{
sw.Write(dt.Rows[i][j].ToString());
if (j != dt.Columns.Count -)
{
sw.Write(",");
}
}
sw.WriteLine();
}
}
return true;
}