using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Reflection;
using System.IO;
using System.Data;
using System.Web;
using System.Data.Odbc;
using System.Text.RegularExpressions;
using System.Collections; namespace KernelClass
{
public class CSVHelper
{ /// <summary>
/// The class CSVHelper read the data from CSV file and store it in a DataTable class,
/// and allows to return a column with index or column name.
/// </summary>
private static readonly char[] FormatSplit = new char[] { ',' };
private const string replaceDoubleQuotes = "$replaceDoubleQuotes$";
private const string tableName = "csvTable"; public static DataTable ReadCSV(string filePath)
{
FileInfo fi = new FileInfo(filePath);
if (fi == null || !fi.Exists) return null; StreamReader reader = new StreamReader(filePath); string line = string.Empty;
int lineNumber = ; DataTable dt = new DataTable(); while ((line = reader.ReadLine()) != null)
{
if (lineNumber == )
{
dt = CreateDataTable(line);
if (dt.Columns.Count == ) return null;
}
else
{
bool isSuccess = CreateDataRow(ref dt, line);
if (!isSuccess)
{
throw new FileLoadException("There are some data unconsistent in your file.");
}
}
lineNumber++;
}
reader.Close(); //如果最后一列是空的话就删除
bool HasValueForLastestColumn = false;
int indexLastestColumn = dt.Columns.Count -;
for (var i = ; i < dt.Rows.Count; i++)
{
if (!string.IsNullOrEmpty(dt.Rows[indexLastestColumn][i].ToString().Trim())) {
HasValueForLastestColumn = true;
break;
}
}
if (HasValueForLastestColumn) {
dt.Columns.RemoveAt(indexLastestColumn);
}
return dt;
} public static bool WriteCSV(DataTable _dataSourc, string filePath)
{
string data = ExportCSV(_dataSourc);
return PhysicalFile.SaveFile(data, filePath);
} public static string ExportCSV(DataTable _dataSource)
{
StringBuilder strbData = new StringBuilder();
foreach (DataColumn column in _dataSource.Columns)
{
strbData.Append(column.ColumnName + ",");
}
strbData.Append("\n");
foreach (DataRow dr in _dataSource.Rows)
{
for (int i = ; i < _dataSource.Columns.Count; i++)
{
string rowValue = dr[i].ToString().Replace("\"", "\"\"");
if(rowValue.Contains(','))
strbData.Append("\"" + dr[i].ToString().Replace("\"", "\"\"") + "\",");
else
strbData.Append(dr[i].ToString() + ",");
}
strbData.Append("\n");
}
return strbData.ToString();
} public static List<double> GetColumnWithName(string columnName, DataTable dt)
{
List<double> list = new List<double>(); var index = dt.Columns.IndexOf(columnName);
list = GetColumnWithIndex(index, dt); return list;
} public static List<double> GetColumnWithIndex(int index, DataTable dt)
{
List<double> list = new List<double>(); foreach (DataRow dr in dt.Rows)
{
var s = dr[index].ToString();
if (string.Compare(s, "") == )
{
break;
}
double value = Convert.ToDouble(s);
list.Add(value);
} return list;
} private static DataTable CreateDataTable(string line)
{
DataTable dt = new DataTable();
foreach (string field in
line.Split(FormatSplit, StringSplitOptions.None))
{
dt.Columns.Add(field);
}
return dt;
} private static bool CreateDataRow(ref DataTable dt, string line)
{
DataRow dr = dt.NewRow();
string src = string.Empty;
Hashtable fields = new Hashtable(); if (!string.IsNullOrEmpty(line))
{
src = line.Replace("\"\"", replaceDoubleQuotes);
//正则表达式找出用双引号包括的字符串, 下面循环是为了防止字符串中含有分隔符 ,
MatchCollection col = Regex.Matches(src, "\"([^\"]+)\"", RegexOptions.ExplicitCapture);
IEnumerator ie = col.GetEnumerator(); while (ie.MoveNext())
{
string patn = ie.Current.ToString();
int key = src.Substring(, src.IndexOf(patn)).Split(',').Length-; if (!fields.ContainsKey(key))
{
fields.Add(key, patn.Trim(new char[] { ',', '"' }));
src = src.Replace(patn, "");
}
} string[] arr = src.Split(',');
for (int i = ; i < arr.Length; i++)
{
if (!fields.ContainsKey(i))
fields.Add(i, arr[i]);
}
} if (fields.Count == || fields.Count > dt.Columns.Count)
{
return false;
} for (int i = ; i < fields.Count; i++)
{
dr[i] = fields[i].ToString().Replace(replaceDoubleQuotes, "\"");
} dt.Rows.Add(dr);
return true;
}
} }

c# 简单文件流读写CSV文件的更多相关文章

  1. js实现使用文件流下载csv文件

    1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...

  2. 使用commons-csv简单读写CSV文件

    文章首发于我的github博客 需求 客户的开发测试环境将做迁移.因此需要对zookeeper上的重要的数据以CSV文件格式做备份. 本文通过Apache的commons-csv操作CSV文件.官网地 ...

  3. 用opencsv文件读写CSV文件

    首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解 ...

  4. 使用Python读写csv文件的三种方法

    Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是 ...

  5. python3读写csv文件

    python读取CSV文件   python中有一个读写csv文件的包,直接import csv即可.利用这个python包可以很方便对csv文件进行操作,一些简单的用法如下. 1. 读文件 csv_ ...

  6. python读写csv文件

    文章链接:https://www.cnblogs.com/cloud-ken/p/8432999.html Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗 ...

  7. 【基础巩固】文件流读写、大文件移动 FileStream StreamWriter File Path Directory/ ,m资料管理器(递归)

    C#获取文件名 扩展名 string fullPath = @"d:\test\default.avi"; string filename = Path.GetFileName(f ...

  8. JAVA读写CSV文件

    最近工作需要,需要读写CSV文件的数据,简单封装了一下 依赖读写CSV文件只需引用`javacsv`这个依赖就可以了 <dependency> <groupId>net.sou ...

  9. (Python基础教程之十二)Python读写CSV文件

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

随机推荐

  1. sql,插入最大值加1

    insert into aa (id,name) values((select case when max(id) is null then 1 else max(id)+1 end from aa) ...

  2. HTTP协议中PUT/GET/POST/HEAD等介绍

    HTTP协议中GET.POST和HEAD的介绍 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 ...

  3. 平衡二叉树(AVL)

    性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树. 定义:平衡二叉树或为空树,或为如下性质的二叉排序树: (1)左右子树深度之差的绝对值不超过1; (2 ...

  4. MYSQL查询某字段中以逗号分隔的字符串的方法

    首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...

  5. ContactsContract.CommonDataKinds【Translated By KillerLegend】

    http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.html interf ...

  6. sql server 跨库操作

    SELECT *FROM OPENDATASOURCE('SQLOLEDB','Data Source=sql服务器名;User ID=用户名;Password=密码;').PersonDb.dbo. ...

  7. main函数的argc和argv

      int main(int argc, char const *argv[]) { printf("argc : %c\n",argc); printf(] ); printf( ...

  8. Stream,Reader/Writer,Buffered的区别(1)

    Stream: 是字节流形式,exe文件,图片,视频等.支持8位的字符,用于 ASCII 字符和二进制数据. Reader/Writer: 是字符流,文本文件,XML,txt等,用于16位字符,也就是 ...

  9. JavaScript高级程序设计之表单基础

    A FORM <form id='form' action='http://a-response-url' method="post"> <!--maxlengt ...

  10. 取精华、去糟粕!适合iOS开发者的15大网站推荐

    iOS开发者若想使技艺达到炉火纯青的地步,就要不断借鉴他人的有益经验,紧跟新兴科技和工具的步伐.除了Apple的开发者中心,其他网站上的文章和资源也具备参考价值,若能学得一二,必能锦上添花.不过,时间 ...