C# Csv實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換DataTable
Csv文件基本的屬性
csv文件可以在excel或者wps中以表格形式打開,本質(zhì)上是每一列以,逗號為分隔符的一種格式,在C#中操作可以把他當(dāng)做普通txt文本讀入,然后通過處理,逗號分隔符來對數(shù)據(jù)進(jìn)行處理轉(zhuǎn)換。
在表格中打開:

在記事本中打開:

Csv讀寫方式
方式一:一次性讀寫
使用File.ReadAllLines一次性讀入。File.WriteAllLines一次性寫入。
這種方式適合csv文件內(nèi)容不多的情況下使用。
示例:
string path="data.csv"; var lines = File.ReadAllLines(path).ToList();
完整的實(shí)現(xiàn):
/// <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,一行一行的讀取文件中的內(nèi)容,并且處理。寫入類似
示例:
using (StreamReader sr = new StreamReader(path))
{
string line;
while ((line = sr.ReadLine()) != null)
{
//處理行數(shù)據(jù)
}
}
Csv文件讀寫DataTable類型
將CSV文件讀入數(shù)據(jù)轉(zhuǎn)成DataTable類型
/// <summary>
/// 讀取Csv文件,加載到DataTable
/// </summary>
/// <param name="path">csv文件路徑</param>
/// <param name="hasTitle">是否有標(biāo)題行</param>
/// <param name="SafeLevel">安全等級:0:錯誤格式行正常添加;1:錯誤行忽略(不添加),2:出現(xiàn)錯誤彈出異常</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格式錯誤:表格各行列數(shù)不一致");
}
}
}
return dt;
}
/// <summary>
/// 以文件流形式讀取Csv文件,加載到DataTable
/// </summary>
/// <param name="path">csv文件路徑</param>
/// <param name="hasTitle">是否有標(biāo)題行</param>
/// <param name="SafeLevel">安全等級:0:錯誤格式行正常添加;1:錯誤行忽略(不添加),2:出現(xiàn)錯誤彈出異常</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格式錯誤:表格各行列數(shù)不一致");
}
}
}
}
}
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))
{
//輸出標(biāo)題行(如果有)
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();
}
//輸出文件內(nèi)容
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;
}
到此這篇關(guān)于C# Csv實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換DataTable的文章就介紹到這了,更多相關(guān)C# Csv讀寫和轉(zhuǎn)換DataTable內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.net4.5使用async和await異步編程實(shí)例
.net4.5使用async和await異步編程實(shí)例,大家參考使用吧2013-12-12
Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng)(著色器代碼實(shí)現(xiàn)小結(jié))
這篇文章主要介紹了Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng),主要總結(jié)unity中shaderlab的著色器代碼實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
C#實(shí)現(xiàn)定時任務(wù)Task Scheduler的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)定時任務(wù)Task Scheduler的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
Unity 按鈕事件封裝操作(EventTriggerListener)
這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
C#去除DataTable重復(fù)數(shù)據(jù)的三種方法
這篇文章主要介紹了C#去除DataTable重復(fù)數(shù)據(jù)的三種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

