前言

公司最近开发需要将数据保存到.csv文件(逗号分隔值 文件)中然后上传到ftp服务器上,供我们系统还有客户系统调用,之前完全没有接触过这个,所以先来看看百度的解释:逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。

CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的描述。使用的字符编码同样没有被指定,但是7-bitASCII是最基本的通用编码。

简单的说就是逗号隔开 双引号 内即为吗需要的值 数据格式并没有非常统一的标准 但是为了避免出错 我们在开发的时候统一格式是这样的

"name","pwd","date"

"张三","123","2015-09-30"

接下来代码处理中默认格式都是这样的 其实就是纯文本的形式

为什么要用csv文件

这就涉及到数据互通的问题,有些程序支持的表格数据另一些程序并不见得支持,而csv格式的却被大多数的应用程序支持,所以在交换保存数据的时候是个不错的选择。

而在项目开发中 有需要做的处理也不是很简单的

比如有csv文件的读取 数据的转换(如转成datatable),csv文件的重命名 ,csv文件的写入,文件上传到ftp服务器上等等

这里将开发的方法进行了简单的整理,以备不时之需,时间仓促,有不足之处大家多多指点。

注意的点

①文件处理完的时候一定记得关闭释放数据流 否则文件会被占用

②csv并没有严格的标准,多人开发的时候必须规定好格式,统一开发

③文件末尾不能出现空的行,不然会出现datatable溢出情况,这种情况可以代码处理 但是开发中最好约束好方便数据处理

一、将CSV文件的数据读取到DataTable中

首先,我们为了方便管理,在web网站中常常需要读取csv文件中的数据并且显示在网站上方便查询。所以比较方便的办法是见csv文件中的数据转换成datatable形式,代码如下。

/// <summary>
/// 将CSV文件的数据读取到DataTable中
/// </summary>
/// <param name="fileName">CSV文件路径</param>
/// <returns>返回读取了CSV数据的DataTable</returns>
public static DataTable OpenCSV(string filePath)
{
    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();
    //记录每次读取的一行记录
    string strLine = "";
    //记录每行记录中的各字段内容
    string[] aryLine = null;
    string[] tableHead = null;
    //标示列数
    ;
    //标示是否是读取的第一行
    bool IsFirst = true;
    //逐行读取CSV中的数据
    while ((strLine = sr.ReadLine()) != null)
    {

        if (IsFirst == true)
        {
            tableHead = strLine.Split(',');
            IsFirst = false;
            columnCount = tableHead.Length;
            //创建列
            ; i < columnCount; i++)
            {
                tableHead[i] = tableHead[i].Replace("\"", "");
                DataColumn dc = new DataColumn(tableHead[i]);
                dt.Columns.Add(dc);
            }
        }
        else
        {
            aryLine = strLine.Split(',');
            DataRow dr = dt.NewRow();
            ; j < columnCount; j++)
            {
                dr[j] = aryLine[j].Replace("\"","");
            }
            dt.Rows.Add(dr);
        }
    }
    )
    {
        dt.DefaultView.Sort = tableHead[] + " " + "DESC";
    }

    sr.Close();
    fs.Close();
    return dt;
}

二、将DataTable中数据写入到CSV文件中

当然我们一个文件中的数据迁移到另一个文件中或者 直接从数据库中查询的数据 插入到csv文件中 ,有一种方法是通过datatable的形式中转,所以 需要把datatable 转成 csv 代码如下:

/// <summary>
/// 将DataTable中数据写入到CSV文件中
/// </summary>
/// <param name="dt">提供保存数据的DataTable</param>
/// <param name="fileName">CSV的文件路径</param>
public static bool SaveCSV(DataTable dt, string fullPath)
{
    try
    {
        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 = "";
        //写出列名称
        ; i < dt.Columns.Count; i++)
        {
            data += "\"" + dt.Columns[i].ColumnName.ToString() + "\"";
            )
            {
                data += ",";
            }
        }
        sw.WriteLine(data);
        //写出各行数据
        ; i < dt.Rows.Count; i++)
        {
            data = "";
            ; j < dt.Columns.Count; j++)
            {
                string str = dt.Rows[i][j].ToString();
                str = string.Format("\"{0}\"", str);
                data += str;
                )
                {
                    data += ",";
                }
            }
            sw.WriteLine(data);
        }
        sw.Close();
        fs.Close();
        return true;
    }
    catch {
        return false;
    }
}

三、修改文件名称

修改文件名称 我们需要保存历史数据 或者实时的知道那个文件被修改 可以通过改变文件的名称 如加上当天的日期等等 方便管理

/// <summary>
/// 修改文件名称
/// </summary>
/// <param name="OldPath">旧的路径 完整的物理路径</param>
/// <param name="NewPath">新的路径</param>
/// <returns></returns>
public static bool ChangeFileName(string OldPath, string NewPath) {
    bool re = false;
    //OldPath = HttpContext.Current.Server.MapPath(OldPath);虚拟的
    //NewPath = HttpContext.Current.Server.MapPath(NewPath);
    try {
        if (File.Exists(OldPath)) {
            File.Move(OldPath, NewPath);
            re = true;
        }
    }
    catch {
        re = false;
    }
    return re;
}

四、scv文件的数据写入

直接在网页表单提交数据保存在csv文件中 直接写入文件

 /// <summary>
 /// 写入文件
 /// </summary>
 /// <param name="fullPath"></param>
 /// <param name="Data"></param>
 /// <returns></returns>
 public static bool SaveCSV(string fullPath,string Data)
 {
     bool re = true;
     try
     {
         FileStream FileStream = new FileStream(fullPath, FileMode.Append);
         StreamWriter sw = new StreamWriter(FileStream, System.Text.Encoding.UTF8);
         sw.WriteLine(Data);
         //清空缓冲区
         sw.Flush();
         //关闭流
         sw.Close();
         FileStream.Close();
     }
     catch {
         re = false;
     }
     return re;
 }

五、上传到ftp服务器

把处理好的数据文件上传到ftp服务器供系统调用

/// <summary>
/// 上传文件
/// </summary>
/// <param name="fileinfo">需要上传的文件</param>
/// <param name="targetDir">目标路径</param>
/// <param name="hostname">ftp地址(不带ftp;//)</param>
/// <param name="username">ftp用户名</param>
/// <param name="password">ftp密码</param>
public static bool UploadFtpFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password)
{
    bool re = true;
    //1. check target
    string target;
    if (targetDir.Trim() == "")
    {
        return false;
    }
    target = fileinfo.Name;  //使用临时文件名

    string URI = "FTP://" + hostname + "/" + targetDir + "/" + target;
    ///WebClient webcl = new WebClient();
    System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);

    //设置FTP命令 设置所要执行的FTP命令,
    //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表
    ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
    //指定文件传输的数据类型
    ftp.UseBinary = true;
    ftp.UsePassive = true;

    //告诉ftp文件大小
    ftp.ContentLength = fileinfo.Length;
    //缓冲大小设置为2KB
    ;
     + ];
    int dataRead;

    //打开一个文件流 (System.IO.FileStream) 去读上传的文件
    using (FileStream fs = fileinfo.OpenRead())
    {
        try
        {
            //把上传的文件写入流
            using (Stream rs = ftp.GetRequestStream())
            {
                do
                {
                    //每次读文件流的2KB
                    dataRead = fs.Read(content, , BufferSize);
                    rs.Write(content, , dataRead);
                } while (!(dataRead < BufferSize));
                rs.Close();
            }

        }
        catch (Exception ex) {
            re = false;

        }
        finally
        {
            fs.Close();
        }
    }
    return re;
}

本文版权归作者(谢俊)和博客园所有,欢迎转载,转载请标明出处。

原文地址:http://www.cnblogs.com/net-xiejun/

微信开发群

完整源码下载:https://github.com/xiejun-net/weixin

公众账号:

C#对.CSV格式的文件--逗号分隔值文件 的读写操作及上传ftp服务器操作方法总结的更多相关文章

  1. Linux小工具:文件上传ftp服务器

    工作期间,每次将文件上传至ftp服务器时,均需要手工输入ip.用户名.密码等,因此,考虑编写脚本完成文件的上传任务.具体的脚本sync.sh如下: #!/bin/bash source ~/.bash ...

  2. HTML5 文件域+FileReader 分段读取文件并上传到服务器(六)

    说明:使用Ajax方式上传,文件不能过大,最好小于三四百兆,因为过多的连续Ajax请求会使后台崩溃,获取InputStream中数据会为空,尤其在Google浏览器测试过程中. 1.简单分段读取文件为 ...

  3. PHP上传文件超过了最大文件大小限制导致无法上传成功

    最近的研究<HeadFirst PHP & MySQL>第一本书5章"使用存储在文件中的数据",难道当一个文件上传应用程序,发生了错误.即,文件不能成功上传.这 ...

  4. MVC图片上传、浏览、删除 ASP.NET MVC之文件上传【一】(八) ASP.NET MVC 图片上传到服务器

    MVC图片上传.浏览.删除   1.存储配置信息 在web.config中,添加配置信息节点 <appSettings> <add key="UploadPath" ...

  5. web操作文件的上传到服务器 并可下载 并且读取出来

    1.文件的上传-servlet实现文件上传---核心API—DiskFileItemFactory 一.文件上传概述 l  实现web开发中的文件上传功能,需完成如下二步操作: •    在web页面 ...

  6. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)

    一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...

  7. edtftpj让Java上传FTP文件支持断点续传

    在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...

  8. java文件上传到服务器

    最近项目中使用到了文件从本地到服务器的功能.其实是为了解决目前浏览器不支持获取本地文件全路径.不得已而想到上传到服务器的固定目录,从而方便项目获取文件,进而使程序支持EXCEL批量导入数据. 在前台界 ...

  9. HTML5 文件域+FileReader 读取文件并上传到服务器(三)

    一.读取文件为blob并上传到服务器 HTML <div class="container"> <!--读取要上传的文件--> <input type ...

随机推荐

  1. Dubbo的使用及原理浅析.

    前面几个博文中关于SSM 框架已经搭建完成, 这里来讲下项目中使用到的Dubbo以及自己了解到的关于Dubbo的一些知识. Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天 ...

  2. Scala类基础

    最近在开始学习Scala,本篇文章我们来讲解一下Scala中类的使用 class Counter { var defaultValue = 0 val valValue = 0 private var ...

  3. IntelliJ IDEA 14和Maven创建java web项目

    安装Maven 下载安装 去maven官网下载最新版. 解压到安装目录. 配置 右键桌面的计算机图标,属性–>高级系统设置–>环境变量,添加M2_HOME的环境变量,然后将该变量加入的PA ...

  4. 研究jdk关于TreeMap 红黑树算法实现

    因为TreeMap的实现方式是用红黑树这种数据结构进行存储的,所以呢我主要通过分析红黑树的实现在看待TreeMap,侧重点也在于如何实现红黑树,因为网上已经有非常都的关于红黑树的实现.我也看了些,但是 ...

  5. 学习CSS3BUTTON(一)

    CSS3 Buttons is a simple framework for creating good-looking GitHub style button links. 引用方式: <li ...

  6. 获取资源ID

    比如,设置一张gif图片的宽高 gif.setShowDimension((int) CommonUtil.getDimen(R.dimen.gif), (int) CommonUtil.getDim ...

  7. [转]SQL Server 和Oracle 数据类型对应

    本文转自:http://blog.sina.com.cn/s/blog_681cd80d0100q84t.html SqlServer 2k转换为Oracle 10g 列名 SqlServer数据类型 ...

  8. Linux的环境变量配置

    以下都是环境变量相关的配置文件 1)/etc/enviroment 是系统的环境变量. (2)/etc/profile: 是所有用户的环境变量.当用户第一次登录时,该文件被执行. 并从/etc/pro ...

  9. redis复制原理和应用

    1.前言 说到分布式高可用,必然少不了复制,一来是为了做个冗余备份防止数据丢失,二来还可以达到分流来提高性能的目的.基本架构: 下面用M表示Master(主服务器),S表示Slave(从服务器),话不 ...

  10. iOS控制反转(IoC)与依赖注入(DI)的实现

    背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大 ...