使用.NET类库操作CSV文件

CSV文件,是指使用逗号对数据进行分割的文本数据文件。昨天有人提出了一个问题,就是怎么对CSV文件进行操作,并且给出了一个类的定义。我根据这个类定义实现了一个能够读些CSV文件的类。

      由于涉及到了字符串操作,为了提高查询、替换性能,我使用了正则表达式。CSV文件打开后,会被读到本地的一个缓冲区中进行操作,然后通过调用Submit()函数项文件中更新。

代码:
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace CSVFileClass
{
    /// <summary>
    /// Summary description for CCSVFile.
    /// </summary>
    public class CCSVFile : IDisposable
    {
        #region   Fields
        private System.IO.FileStream fileStream;
        
        private System.IO.StreamReader streamReader;
        private System.IO.StreamWriter streamWriter;
        
        private string FileName;
        private System.Collections.ArrayList strList = new System.Collections.ArrayList();
        private System.Text.RegularExpressions.Regex MatchField = new Regex(".*?,");
        private System.Text.RegularExpressions.Regex comma = new Regex(",");
        #endregion
        #region Functions
        public CCSVFile(string strFileName)
        {
            //
            // TODO: Add constructor logic here
            //
            this.FileName = strFileName;
            OpenFile();
        }
        //写一行数据,iLineIndex表示写哪一行,strLineContent表示写这一行的内容。
        public void WriteLine(int iLineIndex, string strLineContent)
        {
            if(iLineIndex<=0||iLineIndex>GetLines()+1)
                throw new ArgumentOutOfRangeException("iLineIndex","iLineIndex is out of range");
            this.strList[iLineIndex-1] = strLineContent;

        }
        //读一行数据,iLineIndex表示读哪一行的数据。
        public string ReadLine(int iLineIndex)
        {
               if(iLineIndex<=0||iLineIndex>GetLines())
            {
              throw  new ArgumentOutOfRangeException("iLineIndex","iLineIndex is out of range");
            }    
              string str;
            str = (string)this.strList[iLineIndex-1];
            return str;
        }
        //写一个字段的数据,iLineIndex表示哪一行,iFieldIndex表示哪个字段,strFieldContent表示字段内容,检查strFieldContent是否有逗号,如果内容中有就返回-1。
        public bool WriteField(int iLineIndex, int iFieldIndex, string strFieldContent)
        {  
            if (MatchField.IsMatch(strFieldContent))
                return false;


            if(iLineIndex<=0||iLineIndex>GetLines())
            {
                throw  new ArgumentOutOfRangeException("iLineIndex","iLineIndex is out of range");
            }    
            string str;
            str = (string)this.strList[iLineIndex-1];
            MatchCollection matchList = MatchField.Matches(str);
            
            if(iFieldIndex<=0||iFieldIndex>matchList.Count)
                 return false;
            
                 strFieldContent +=",";
            int i = matchList[iLineIndex-1].Index;  
            this.strList[iLineIndex-1] = MatchField.Replace(str,strFieldContent,1,matchList[iFieldIndex-1].Index);
            
                return true;
        }
        //读字段的值。
        public string ReadField(int iLineIndex, int iFieldIndex)
        {
              string result = null;
            

            if(iLineIndex<=0||iLineIndex>GetLines())
            {
                throw  new ArgumentOutOfRangeException("iLineIndex","iLineIndex is out of range");
            }    
            string str;
            str = (string)this.strList[iLineIndex-1];
            MatchCollection matchList = MatchField.Matches(str);
            
            if(iFieldIndex<=0||iFieldIndex>matchList.Count)
                return comma.Replace(result,"");
               result = matchList[iFieldIndex-1].Value.ToString();
                 return comma.Replace(result,"");
              }
        //得到需要读写的哪一行
        private int GetLines()
        {
            return this.strList.Count;
        }
        
        //向文件提交数据
        public void Submit()
        {
               this.streamReader.Close();
            this.streamWriter = new StreamWriter(this.FileName);
            foreach (string str in this.strList)
            {
                this.streamWriter.WriteLine(str);        
            
            }
            this.streamWriter.Close();
             OpenFile();
        
        }

        //打开指定文件
        private void OpenFile()
        {
        
            try
            {
                fileStream = new FileStream(this.FileName,System.IO.FileMode.Open,System.IO.FileAccess.ReadWrite);    
            }
            catch(System.IO.FileNotFoundException e)
            {
                this.fileStream = null;
                throw new System.IO.FileNotFoundException(e.Message,e.FileName,e.InnerException);
                
            }
            string tmpString;
            streamReader = new StreamReader(this.fileStream);
            do
            {
                tmpString = this.streamReader.ReadLine();
                if(null != tmpString)
                    strList.Add(tmpString);
            }
            while(null != tmpString);

        
        }
        
        public void Close()
        {
           this.Dispose();
        
        }
        #endregion
        #region IDisposable 成员

        public void Dispose()
        {
            // TODO:  添加 CCSVFile.Dispose 实现
          this.fileStream.Close();
            this.streamReader.Close();
               this.streamWriter.Close();
        }

        #endregion
    }
}

转载于:https://www.cnblogs.com/net66/archive/2005/07/26/200704.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uva 11054——Wine trading in Gergovia

题意&#xff1a;有n个村庄&#xff0c;每个村庄要么买酒&#xff08;&#xff09;&#xff0c;要么卖酒&#xff08;-&#xff09;&#xff0c;要求供需平衡&#xff0c;求最小代价&#xff08;代价k为把k个单位的酒运到相邻的村庄&#xff09;。 思路&#xff1a;贪心。可以把…

uva 1312——Cricket Field

题意&#xff1a;在w*h的方格内&#xff0c;找出一个最大的正方形&#xff0c;使得正方形内没有点&#xff08;可以在边界有点&#xff09;。 思路&#xff1a;枚举。正方形可以看作是矩形&#xff0c;只不过在取的时候取最短的那条边作为边长&#xff0c;那么枚举出短边最大的…

【操作系统】页面置换算法

页面置换算法 在进程运行过程中&#xff0c;若需要访问的物理块不在内存中&#xff0c;就需要通过一定的方式来将页面载入内存&#xff0c;而此时内存很可能已无空闲空间&#xff0c;因此就需要一定的算法来选择内存中要被置换的页面&#xff0c;这种算法就被称为页面置换算法。…

uva 1617——Laptop

题意&#xff1a;有n个长度为1的线段&#xff0c;确定它们的起点&#xff0c;使得第i个线段在【ri&#xff0c;di】之间&#xff0c;输出空隙数目的最小值。 思路&#xff1a;贪心。首先对区间进行排序&#xff0c;然后扫描一遍&#xff0c;当上一个线段最右边加1《当前最左的点…

ubuntu18.04安装、配置dosbox

1 安装dosbox&#xff1a;打开终端&#xff0c;输入&#xff1a; sudo apt install dosbox 2 安装完成后&#xff0c;启动dosbox&#xff0c;在终端输入&#xff1a; dosbox 3 设置自动挂载 退出dosbox&#xff0c;在终端中输入&#xff1a; vim .dosbox/dosbox-0.74.con…

关于 SENDKEYS 的代码

sendkeys 的用法&#xff08;MSDN&#xff09;&#xff1a; SendKeys 语句 将一个或多个按键消息发送到活动窗口&#xff0c;就如同在键盘上进行输入一样。 语法 SendKeys string[, wait] SendKeys 语句的语法具有以下几个命名参数&#xff1a; 部分描述string必需的。字符串表…

uva 1615——Highway

题意&#xff1a; 给定平面上n个点&#xff0c;和一个值D&#xff0c;要求在x轴上选出尽量少的点&#xff0c;使得对给定的点&#xff0c;都有一个点离他的欧几里德距离步超过D。 思路&#xff1a;区间覆盖问题。以平面上的点为圆心&#xff0c;以D为半径&#xff0c;求出来一个…

解决linux写入ntfs盘时报错:只读文件系统

[2018.10.28 更新] 可能因为在挂载wimdows盘后&#xff0c;强制关机造成的&#xff0c;可使用 sudo ntfsfix /dev/*** 来修复。其中&#xff0c;***为具体哪个盘&#xff0c;例如sudo ntfsfix /dev/sda4 之前一直可以对windows盘进行读写操作&#xff0c;但今天突然不能用了&am…

家里装AD了

通过关系&#xff0c;家里终于装上了ADSL&#xff0c;而且还是130包月的&#xff0c;还免了调测费转载于:https://www.cnblogs.com/d9394/archive/2005/09/28/10611828.html

uva 1613——K-Graph Oddity

题意&#xff1a;输入n个点m条边的联通图&#xff0c;n为奇数&#xff0c;设k为最小的奇数&#xff0c;使得每个点的度数不超过k&#xff0c;要求把节点都涂上颜色&#xff0c;使得相邻节点颜色不一样。 思路&#xff1a;dfs。k的值为奇数&#xff0c;所以k为节点最大度数&…

应用ADO.net得到表

----------------------------------------------------------开发者&#xff1a;开发时间&#xff1a;2004.9.9功能&#xff1a;应用ADO.net得到表----------------------------------------------------------Imports Zy_DataAccessImports SystemImports System.DataImports…

uva 11093——Just Finish it up

题意&#xff1a;环形跑道上有n个加油站&#xff0c;每个站可以加pi单位的油&#xff0c;从当前站开到下一站需要qi的油&#xff0c;问是否能够环游一圈。 思路&#xff1a;枚举。首先如果总需求量>总供给量&#xff0c;那么不可能。否则就枚举起点&#xff0c;如果油箱里的…

【计算机网络】TCP IP通信处理过程

1.数据包首部 每个分层中都会对所发送的数据附加一个首部&#xff0c;其中包含了该层必要的信息&#xff0c;如发送端地址、接收端地址以及协议等相关信息。 2.发送数据包 1&#xff09;应用程序处理 进行编码处理&#xff08;相当于表示层功能&#xff09;&#xff0c;管…

感觉自己越来越浮躁

重新审视自己的技术走向&#xff0c;不得不承认&#xff0c;越来越向上层迈进。但是这不是我喜欢的&#xff0c;一味的追求快速开发&#xff0c;希望自己的开发速度能一个人顶10个人&#xff0c;但是往往容易在项目中迷失自己&#xff0c;很希望能快点结束这段噩梦般的项目&…

uva 12627——Erratic Expansion

题意&#xff1a;一开始有1个红气球&#xff0c;每小时一个红气球都会变成3个红气球和1个蓝气球&#xff0c;1个蓝气球会变成4个蓝气球&#xff0c;问k个小时后a行到b行的红气球的数量。 思路&#xff1a;递推。a为偶数时&#xff0c;计算a1到b以及a本行的红气球数。b为奇数时&…

【计算机网络】数据链路相关技术

1.MAC地址 MAC地址长48字节。在使用网卡的情况下&#xff0c;一般会将MAC地址烧入到ROM中&#xff0c;任何一个网卡的MAC地址都是唯一的。例如 00:10:5A:70:33:61 MAC地址的3~24位表示厂商识别码&#xff0c;每个NIC厂商都有特定唯一的识别数字。25~48位是厂商内部为识别每个…

uva 714——Copying Books

题意&#xff1a;把一个m个整数的序列划分成k个连续非空的子序列&#xff0c;使得子序列和的最大值最小。 思路&#xff1a;二分。遇到最大值最小大多都二分了&#xff0c;让划分的子序列都不超过x&#xff0c;根据x来judge最终结果k个是多还是少&#xff0c;然后二分来调整x直…

[JavaScript]让footer总是停留在页面的底部(footer all the way at the bottom of the page)

在网页的底部总是保留着公司的版本信息&#xff0c;如何是这部分信息来实现呢&#xff1f;下面的一段javascript演示了如何让footer总是停留在页面的底部。这段代码我在实际使用的时候不是特别的完美&#xff0c;在包含有其他javascript控制的页面和控件的时候会出现重叠的现象…

【计算机网络】IP地址

IP地址的基础知识 在TCP/IP通信中&#xff0c;IP地址用于识别主机和路由器。 1.IP地址的定义 IPv4地址为32位&#xff0c;IPv6地址为128位。&#xff08;以下以IPv4为例&#xff09; 将32位的IP地址分为4组&#xff0c;每组8位&#xff0c;每组间用“.”隔开&#xff0c;再…

uva 1451——Average

题意&#xff1a;给定一个长度为n 的01串&#xff0c;然后选一个长度至少为L的子串&#xff0c;使得子串的平均值最大。 思路&#xff1a;单调队列。如果把所有的前缀和都求出来&#xff0c;那么所求即为max((s[j] - s[i]) / (j - i)) &#xff0c;转化成图也就是求斜率最大的那…