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

在記事本中打開(kāi):

Csv讀寫(xiě)方式
方式一:一次性讀寫(xiě)
使用File.ReadAllLines一次性讀入。File.WriteAllLines一次性寫(xiě)入。
這種方式適合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;
}
方式二:使用文件流形式讀寫(xiě)
使用StreamReader,一行一行的讀取文件中的內(nèi)容,并且處理。寫(xiě)入類(lèi)似
示例:
using (StreamReader sr = new StreamReader(path))
{
string line;
while ((line = sr.ReadLine()) != null)
{
//處理行數(shù)據(jù)
}
}
Csv文件讀寫(xiě)DataTable類(lèi)型
將CSV文件讀入數(shù)據(jù)轉(zhuǎn)成DataTable類(lèi)型
/// <summary>
/// 讀取Csv文件,加載到DataTable
/// </summary>
/// <param name="path">csv文件路徑</param>
/// <param name="hasTitle">是否有標(biāo)題行</param>
/// <param name="SafeLevel">安全等級(jí):0:錯(cuò)誤格式行正常添加;1:錯(cuò)誤行忽略(不添加),2:出現(xiàn)錯(cuò)誤彈出異常</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格式錯(cuò)誤:表格各行列數(shù)不一致");
}
}
}
return dt;
}
/// <summary>
/// 以文件流形式讀取Csv文件,加載到DataTable
/// </summary>
/// <param name="path">csv文件路徑</param>
/// <param name="hasTitle">是否有標(biāo)題行</param>
/// <param name="SafeLevel">安全等級(jí):0:錯(cuò)誤格式行正常添加;1:錯(cuò)誤行忽略(不添加),2:出現(xiàn)錯(cuò)誤彈出異常</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格式錯(cuò)誤:表格各行列數(shù)不一致");
}
}
}
}
}
return dt;
}
將DataTable類(lèi)型寫(xiě)入到Csv文件中去
/// <summary>
/// 以文件流形式將DataTable寫(xiě)入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)基本的讀寫(xiě)和轉(zhuǎn)換DataTable的文章就介紹到這了,更多相關(guān)C# Csv讀寫(xiě)和轉(zhuǎn)換DataTable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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ì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
C#實(shí)現(xiàn)定時(shí)任務(wù)Task Scheduler的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)定時(shí)任務(wù)Task Scheduler的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
Unity 按鈕事件封裝操作(EventTriggerListener)
這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
C#語(yǔ)言中字符類(lèi)char的使用方法(總結(jié))
下面小編就為大家?guī)?lái)一篇C#語(yǔ)言中字符類(lèi)char的使用方法(總結(jié))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
C#去除DataTable重復(fù)數(shù)據(jù)的三種方法
這篇文章主要介紹了C#去除DataTable重復(fù)數(shù)據(jù)的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

