/***********************
Author: Tst
CSDN blog: Ricardo.M.Tan
************************/
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
namespace Chn.gzGISer.Utility
{
/// <summary>
/// CSV文件读写扩展方法
/// </summary>
public class CSVExten
{
/// <summary>
/// 将内存中的数据表写入.csv文件中
/// </summary>
/// <param name="table">DataTable表</param>
/// <param name="path">路径</param>
/// <param name="writeSize">一次读写的最大长度</param>
/// <returns>返回bool值,true 成功, false 失败</returns>
public static bool DataTableWriteToCsvFile(DataTable table, string path, int writeSize)
{
//以半角逗号(即,)作分隔符,列为空也要表达其存在。
//列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
//列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。
StringBuilder sb = new StringBuilder();
try
{
int rowCount = table.Rows.Count;
if (rowCount > writeSize)
{
int count = 0;
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < table.Columns.Count; i++)
{
if (i != 0)
{
sb.Append(",");
}
DataRowToDataString(row, table.Columns[i], ref sb);
}
sb.AppendLine();
count++;
if (count == writeSize)
{
File.AppendAllText(path, sb.ToString());
sb.Clear();
count = 0;
}
}
if (count > 0)
{
File.AppendAllText(path, sb.ToString());
}
sb.Clear();
sb = null;
return true;
}
else
{
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < table.Columns.Count; i++)
{
if (i != 0) sb.Append(",");
DataRowToDataString(row, table.Columns[i], ref sb);
}
sb.AppendLine();
}
File.WriteAllText(path, sb.ToString());
sb.Clear();
sb = null;
return true;
}
}
catch (Exception)
{
throw;
}
finally
{
sb.Clear();
sb = null;
}
}
private static void DataRowToDataString(DataRow row, DataColumn column, ref StringBuilder sb)
{
if (column.DataType == typeof(string) && row[column].ToString().Contains(","))
{
sb.Append("\"" + row[column].ToString().Replace("\"", "\"\"") + "\"");
}
else
{
sb.Append(row[column].ToString());
}
}
}
}