c# 简单文件流读写CSV文件
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文件的更多相关文章
- js实现使用文件流下载csv文件
1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...
- 使用commons-csv简单读写CSV文件
文章首发于我的github博客 需求 客户的开发测试环境将做迁移.因此需要对zookeeper上的重要的数据以CSV文件格式做备份. 本文通过Apache的commons-csv操作CSV文件.官网地 ...
- 用opencsv文件读写CSV文件
首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解 ...
- 使用Python读写csv文件的三种方法
Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是 ...
- python3读写csv文件
python读取CSV文件 python中有一个读写csv文件的包,直接import csv即可.利用这个python包可以很方便对csv文件进行操作,一些简单的用法如下. 1. 读文件 csv_ ...
- python读写csv文件
文章链接:https://www.cnblogs.com/cloud-ken/p/8432999.html Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗 ...
- 【基础巩固】文件流读写、大文件移动 FileStream StreamWriter File Path Directory/ ,m资料管理器(递归)
C#获取文件名 扩展名 string fullPath = @"d:\test\default.avi"; string filename = Path.GetFileName(f ...
- JAVA读写CSV文件
最近工作需要,需要读写CSV文件的数据,简单封装了一下 依赖读写CSV文件只需引用`javacsv`这个依赖就可以了 <dependency> <groupId>net.sou ...
- (Python基础教程之十二)Python读写CSV文件
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
随机推荐
- 通过JAVA代码获取手机的一些基本信息(本机号码,SDK版本,系统版本,手机型号)
代码如下: package com.zzw.getPhoneInfos; import android.app.Activity; import android.content.Context; im ...
- Web Design:给实验室UI们的一堂课(上)
实验室的UI越来越水,设计什么的做的一塌糊涂,所以拖了很久,就想给他们讲一下设计或者说入门吧,上周末才倒出来时间. 这里放上PPT和讲稿吧,懒得去整理板式了. 主要讲了一下Web Design怎么做, ...
- find your present
Description In the present, and their card numbers are , , , , .so your present will be the one with ...
- Why string is immutable in Java ?
This is an old yet still popular question. There are multiple reasons that String is designed to be ...
- Android 设计模式
简介 项目开发中发现问题.解决问题这个过程中会出现很多问题,比如重复出现.某个问题的遗留,这些问题的本质就是设计模式.今天记录设计模式的知识点. 内容 在java以及其他的面向对象设计模式中,类与类之 ...
- webservice soapclient报错Error fetching http headers
设置: ini_set('default_socket_timeout', 600); // or whatever new value you want 参考:http://stackoverflo ...
- c/c++常用代码 -- ini文件操作
#pragma once #include <string> #include <sstream> typedef std::basic_string<TCHAR> ...
- angularJS项目-ajax事件的按钮loading和页面loading状态 & Controller之间通信-待续
1).按钮loading --TODO 2). page loading状态 1.在module中注入指令 // Route State Load Spinner(used on page or co ...
- urllib3 ConnectionPools
A connection pool is a container for a collection of connections to a specific host.If you need to m ...
- transform属性
transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度常用的创建transform结构体方法分两大类 (1) 创建“基于控件初始位置”的形变 CGAffin ...