• C# CSV文件的导入导出以及datatable转化csv


    1.csv文件写入操作

    首先,创建datatable对象:

    DataTable dt = new DataTable();
    添加列:
    dt.Columns.Add("name", typeof(string));
    添加一个DataRow 对象,用于添加行:
    DataRow dr = dt.NewRow();
    dr[0] = "pingg";
    dt.Rows.Add(dr);
    CSVFileHelper.SaveCSV(dt, GetAppPath() + "/name.csv");
     
    这样,就添加了一行一列:name pingg
     
    2.csv文件读取操作
    创建一个datatable用来读取csv:
    DataTable dtread = CSVFileHelper.OpenCSV(GetAppPath() + "/name.csv");
    DataRow drread = dtread.Rows[0];
    //drread[0]就是第一行的数据:pingg
     
     3.CSVFileHelper.cs类文件:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace Common
    {
    public class CSVFileHelper
    {
    /// <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(' ') || str.Contains(' ')) //含逗号 冒号 换行符的需要放到引号中
    {
    str = string.Format(""{0}"", str);
    }

    data += str;
    if (j < dt.Columns.Count - 1)
    {
    data += ",";
    }
    }
    sw.WriteLine(data);
    }
    sw.Close();
    fs.Close();
    // DialogResult result = MessageBox.Show("CSV文件保存成功!");
    //if (result == DialogResult.OK)
    //{
    // System.Diagnostics.Process.Start("explorer.exe", Common.PATH_LANG);
    //}
    }
    /// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型
    /// <param name="FILE_NAME">文件路径</param>
    /// <returns>文件的编码类型</returns>

    public static System.Text.Encoding GetType(string FILE_NAME)
    {
    System.IO.FileStream fs = new System.IO.FileStream(FILE_NAME, System.IO.FileMode.Open,
    System.IO.FileAccess.Read);
    System.Text.Encoding r = GetType(fs);
    fs.Close();
    return r;
    }
    /// 通过给定的文件流,判断文件的编码类型
    /// <param name="fs">文件流</param>
    /// <returns>文件的编码类型</returns>
    public static System.Text.Encoding GetType(System.IO.FileStream fs)
    {
    byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
    byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
    byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
    System.Text.Encoding reVal = System.Text.Encoding.Default;

    System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default);
    int i;
    int.TryParse(fs.Length.ToString(), out i);
    byte[] ss = r.ReadBytes(i);
    if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
    {
    reVal = System.Text.Encoding.UTF8;
    }
    else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
    {
    reVal = System.Text.Encoding.BigEndianUnicode;
    }
    else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
    {
    reVal = System.Text.Encoding.Unicode;
    }
    r.Close();
    return reVal;
    }
    /// 判断是否是不带 BOM 的 UTF8 格式
    /// <param name="data"></param>
    /// <returns></returns>
    private static bool IsUTF8Bytes(byte[] data)
    {
    int charByteCounter = 1;  //计算当前正分析的字符应还有的字节数
    byte curByte; //当前分析的字节.
    for (int i = 0; i < data.Length; i++)
    {
    curByte = data[i];
    if (charByteCounter == 1)
    {
    if (curByte >= 0x80)
    {
    //判断当前
    while (((curByte <<= 1) & 0x80) != 0)
    {
    charByteCounter++;
    }
    //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X 
    if (charByteCounter == 1 || charByteCounter > 6)
    {
    return false;
    }
    }
    }
    else
    {
    //若是UTF-8 此时第一位必须为1
    if ((curByte & 0xC0) != 0x80)
    {
    return false;
    }
    charByteCounter--;
    }
    }
    if (charByteCounter > 1)
    {
    throw new Exception("非预期的byte格式");
    }
    return true;
    }
    /// <summary>
    /// 将CSV文件的数据读取到DataTable中
    /// </summary>
    /// <param name="fileName">CSV文件路径</param>
    /// <returns>返回读取了CSV数据的DataTable</returns>
    public static DataTable OpenCSV(string filePath)
    {
    Encoding encoding = GetType(filePath); //Encoding.ASCII;//
    DataTable dt = new DataTable();
    FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);

    //StreamReader sr = new StreamReader(fs, Encoding.UTF8);
    StreamReader sr = new StreamReader(fs, encoding);
    //string fileContent = sr.ReadToEnd();
    //encoding = sr.CurrentEncoding;
    //记录每次读取的一行记录
    string strLine = "";
    //记录每行记录中的各字段内容
    string[] aryLine = null;
    string[] tableHead = null;
    //标示列数
    int columnCount = 0;
    //标示是否是读取的第一行
    bool IsFirst = true;
    //逐行读取CSV中的数据
    while ((strLine = sr.ReadLine()) != null)
    {
    //strLine = Common.ConvertStringUTF8(strLine, encoding);
    //strLine = Common.ConvertStringUTF8(strLine);

    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;
    }
    public static string GetAppPath()
    {
    try
    {
    string _CodeBase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
    _CodeBase = _CodeBase.Substring(8, _CodeBase.Length - 8); // 8是 file:// 的长度
    string[] arrSection = _CodeBase.Split(new char[] { '/' });
    string _FolderPath = "";
    for (int i = 0; i < arrSection.Length - 1; i++)
    {
    _FolderPath += arrSection[i] + "/";
    }
    return _FolderPath.Replace("/", @"");
    }
    catch
    {
    return null;
    }
    }
    }
    }

     
  • 相关阅读:
    day15-collection和其子类
    day14-正则表达式和常用类
    day13-StringBuffer和数组高级,Arrays
    day12-Scanner和String
    day11-object
    linux进程(一)
    CentOS6与CentOS7的启动过程
    linux特殊权限(acl)
    linux系统权限(基本权限)
    linux系统用户管理(二)
  • 原文地址:https://www.cnblogs.com/CHPowerljp-IT/p/10990655.html
Copyright © 2020-2023  润新知