public class CSVHelper
{
/// <summary>
/// 将DataTable中数据写入到CSV文件中
/// </summary>
/// <param name="dt">提供保存数据的DataTable</param>
/// <param name="fileName">CSV的文件路径</param>
public static void SaveCSV(DataTable dt, string fullPath)
{
FileInfo fi = new FileInfo(fullPath);
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
FileStream fs = new FileStream(fullPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
//StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
string data = "";
//写出列名称
for (int i = 0; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName.ToString();
if (i < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
//写出各行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
data = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
string str = dt.Rows[i][j].ToString();
str = str.Replace("\"", "\"\"");//替换英文冒号 英文冒号需要换成两个冒号
if (str.Contains(',') || str.Contains('"')
|| str.Contains('\r') || str.Contains('\n')) //含逗号 冒号 换行符的需要放到引号中
{
str = string.Format("\"{0}\"", str);
}
data += str;
if (j < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
}
sw.Close();
fs.Close();
}
/// <summary>
/// 将CSV文件的数据读取到DataTable中
/// </summary>
/// <param name="fileName">CSV文件路径</param>
/// <returns>返回读取了CSV数据的DataTable</returns>
public static DataTable OpenCSV(string filePath)
{
try
{
DataTable dt = new DataTable();
FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
//记录每次读取的一行记录
string strLine = "";
//记录每行记录中的各字段内容
string[] aryLine = null;
string[] tableHead = null;
//标示列数
int columnCount = 0;
//标示是否是读取的第一行
bool IsFirst = true;
//逐行读取CSV中的数据
while ((strLine = sr.ReadLine()) != null)
{
if (IsFirst == true)
{
tableHead = strLine.Split(',');
IsFirst = false;
columnCount = tableHead.Length;
//创建列
for (int i = 0; i < columnCount; i++)
{
DataColumn dc = new DataColumn(tableHead[i]);
dt.Columns.Add(dc);
}
}
else
{
aryLine = strLine.Split(',');
DataRow dr = dt.NewRow();
for (int j = 0; j < columnCount; j++)
{
dr[j] = aryLine[j];
}
dt.Rows.Add(dr);
}
}
//if (aryLine != null && aryLine.Length > 0)
//{
// dt.DefaultView.Sort = tableHead[0] + " " + "asc";
//}
sr.Close();
fs.Close();
return dt;
}
catch (Exception ex)
{
throw ex;
}
}
public static Encoding GetFileEncoding(string filePath)
{
Encoding Result = null;
FileInfo info = new FileInfo(filePath);
FileStream fs = default(FileStream);
try
{
fs = info.OpenRead();
Encoding[] unicodeEncodings =
{
Encoding.BigEndianUnicode,
Encoding.Unicode,
Encoding.UTF8,
Encoding.UTF32,
Encoding.UTF7,
new UTF32Encoding(true,true)
};
for (int i = 0; Result == null && i < unicodeEncodings.Length; i++)
{
fs.Position = 0;
byte[] preamble = unicodeEncodings[i].GetPreamble();
bool isEqual = true;
for (int j = 0; isEqual && j < preamble.Length; j++)
{
isEqual = preamble[j] == fs.ReadByte();
}
if (isEqual)
Result = unicodeEncodings[i];
}
}
catch (IOException ex)
{
throw ex;
}
finally
{
if (fs != null)
{
fs.Close();//包括了Dispose,并通过GC强行释放资源
}
}
if (object.ReferenceEquals(null, Result))
{
Result = Encoding.Default;
}
return Result;
}
}