C#中csv文件与DataTable互相导入处理实例解析
作者:shichen2014 发布时间:2023-01-16 19:32:35
标签:C#,csv,DataTable,导入
本文介绍了C#中csv文件与DataTable互相导入处理实例解析,主要功能代码封装处理下,相对比较简单。以后项目用到的话可以直接使用。具体方法如下:
1.封装好的类如下:
using System;
using System.Data;
using System.IO;
using System.Text;
using CSharpUtilHelpV2;
using StringUtilHelp;
namespace DBUtilHelpV2Plus
{
public static class DBToolV2Plus
{
/// <summary>
/// 将DataTable导出到CSV.
/// </summary>
/// <param name="table">DataTable</param>
/// <param name="fullSavePath">保存路径</param>
/// <param name="tableheader">标题信息</param>
/// <param name="columname">列名称『eg:姓名,年龄』</param>
/// <returns>导出成功true;导出失败false</returns>
public static bool ToCSV(this DataTable table, string fullSavePath, string tableheader, string columname)
{
ArgumentChecked(table, fullSavePath);
//------------------------------------------------------------------------------------
try
{
string _bufferLine = "";
using (StreamWriter _writerObj = new StreamWriter(fullSavePath, false, Encoding.UTF8))
{
if (!string.IsNullOrEmpty(tableheader))
_writerObj.WriteLine(tableheader);
if (!string.IsNullOrEmpty(columname))
_writerObj.WriteLine(columname);
for (int i = 0; i < table.Rows.Count; i++)
{
_bufferLine = "";
for (int j = 0; j < table.Columns.Count; j++)
{
if (j > 0)
_bufferLine += ",";
_bufferLine += table.Rows[i][j].ToString();
}
_writerObj.WriteLine(_bufferLine);
}
return true;
}
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// 参数检查
/// </summary>
/// <param name="table"></param>
/// <param name="fullSavePath"></param>
private static void ArgumentChecked(DataTable table, string fullSavePath)
{
if (table == null)
throw new ArgumentNullException("table");
if (string.IsNullOrEmpty(fullSavePath))
throw new ArgumentNullException("fullSavePath");
string _fileName = CSharpToolV2.GetFileNameOnly(fullSavePath);
if (string.IsNullOrEmpty(_fileName))
throw new ArgumentException(string.Format("参数fullSavePath的值{0},不是正确的文件路径!", fullSavePath));
if (!_fileName.InvalidFileNameChars())
throw new ArgumentException(string.Format("参数fullSavePath的值{0},包含非法字符!", fullSavePath));
}
/// <summary>
/// 将CSV文件数据导入到Datable中
/// </summary>
/// <param name="table"></param>
/// <param name="filePath">DataTable</param>
/// <param name="rowIndex">保存路径</param>
/// <returns>Datable</returns>
public static DataTable AppendCSVRecord(this DataTable table, string filePath, int rowIndex)
{
ArgumentChecked(table, filePath);
if (rowIndex < 0)
throw new ArgumentException("rowIndex");
using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8, false))
{
int i = 0, j = 0;
reader.Peek();
while (reader.Peek() > 0)
{
j = j + 1;
string _line = reader.ReadLine();
if (j >= rowIndex + 1)
{
string[] _split = _line.Split(',');
DataRow _row = table.NewRow();
for (i = 0; i < _split.Length; i++)
{
_row[i] = _split[i];
}
table.Rows.Add(_row);
}
}
return table;
}
}
}
}
2.代码使用测试如下:
using System;
using System.Data;
using DBUtilHelpV2;
using DBUtilHelpV2Plus;
namespace DBUtilHelpV2PlusTest
{
class Program
{
static DataTable testDb = null;
static string fullSavePath = string.Format(@"C:\{0}.csv", DateTime.Now.ToString("yyyyMMddHH"));
static void Main(string[] args)
{
try
{
CreateTestDb();
Console.WriteLine(string.Format("DataTable导出到CSV文件{0}.", testDb.ToCSV(fullSavePath, "姓名,年龄", "人员信息表") == true ? "成功" : "失败"));
testDb.Rows.Clear();
Console.WriteLine(string.Format("清空数据,当前{0}条数据.", testDb.Rows.Count));
testDb = testDb.AppendCSVRecord(fullSavePath, 2);
Console.WriteLine(string.Format("CSV文件导入到Datable,导入{0}条数据.", testDb.Rows.Count));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.ReadLine();
}
}
static void CreateTestDb()
{
if (testDb == null)
{
testDb = DBToolV2.CreateTable("Name,Age|int");
for (int i = 1; i <= 10; i++)
{
DataRow _row = testDb.NewRow();
_row["Name"] = string.Format("YanZhiwei_{0}", i);
_row["Age"] = i;
testDb.Rows.Add(_row);
}
}
}
}
}
运行效果如下图所示:


猜你喜欢
- 本文实例讲述了Android中Bitmap用法。分享给大家供大家参考,具体如下:一般在android程序中把图片文件放在res/drawab
- 一个专门实现访问sql server数据库增删改查的操作代码,分享给大家,具体内容如下using System;using System.C
- 问题描述Feign 在请求时是不会将 request 的请求头带着请求的,导致假如 Feign 调用的接口需要请求头的信息,比如当前用户的
- Java 实现FTP服务实例详解1、FTP简介 FTP
- spring data jpa使用自定义repository实现类spring data jpa中使用JpaRepository等接口定义r
- 前言在Java 8之前,默认情况下,接口中的所有方法都是公共的和抽象的。但是这一限制在Java 8中被打破了,Java 8允许开发人员在接口
- 我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Java 提供DecimalFormat类,帮你用最快的速度将数字格式化为你需要的
- Spring Boot 集成MyBatis在集成MyBatis前,我们先配置一个druid数据源。Spring Boot 集成druiddr
- 目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel直接上代码:一,POIPOI是apa
- 前言事务对java开发的同学来说并不陌生,我们使用事务的目的在于避免产生重复数据或者说利用数据存储中间件的事务特性确保数据的精准性,比如大家
- 今天,简单讲讲android里如何获取一个视频文件的第一帧作为缩略图显示在界面上。之前,我说个最近需要从服务器下载视频文件,但是下载后肯定需
- FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写FreeMarker被设计用来生成HTML Web
- 废话不多说了,直接给大家贴代码了。具体代码如下所述:<?xml version="1.0" encoding=&q
- Token 一定要放在请求头中吗? 答案肯定是否定的,本文将从源码的角度来分享一下 spring security oauth2 的解析过程
- Android studio开发工具中,如何如何删除Android项目,下面是在Android studio 1.5正式版删除Android
- Gstreamer到底是个啥?GStreamer 是一个 基于pipeline的多媒体框架,基于GObject,以C语言写成。应用GStre
- 本文实例为大家分享了javafx实现时钟效果的具体代码,供大家参考,具体内容如下核心为三个函数:第一个为 public void dials
- 为什么要用ELKELK实际上是三个工具,Elastricsearch + Logstash + Kibana,通过ELK,用来收集日志还有进
- 目录认识@Import注解搭建项目结构用于测试@Import用法最佳搭档 - @Import通用形式总结认识@Import注解先看一下源码@
- mybatis #{}无法自动添加引号传入string类型时,无法自动添加引号,导致SQL将值识别为列名,导致SQL失败解决使用map类型代