读书人

C# winform 读取csv文件 有关问题(二)

发布时间: 2012-05-20 16:03:12 作者: rapoo

C# winform 读取csv文件 问题(二)
前一帖子三连了。 我去 倒霉csv还没搞好 我就郁闷了。。
之前我用的第一个方法 读大文件会卡掉。
后来有个朋友找了个
http://www.codeproject.com/KB/database/CsvReader.aspx
快速读取
我弄半天搞不懂。。

于是我自己找了个
http://www.csvreader.com
还算可以蛮快的 很好用

但是我后来发现 他读数据 有写数据会显示

貌似读到10行后开始出现 没格一列 就会出来 一列 DEMO

求救啊 大侠们 速度了。。多给分

[解决办法]
F11单步,DEMO那里显示的
[解决办法]
http://www.shilidata.com/showforum-44.aspx
[解决办法]
demo??
难道用了试用版的库了?
看看下载CsvReader 的地方是不是需要购买的,没费下载的只是试用版。
[解决办法]
CsvReader不是开源的吗? Codeproject上有看到过啊
[解决办法]

探讨
demo??
难道用了试用版的库了?
看看下载CsvReader 的地方是不是需要购买的,没费下载的只是试用版。

[解决办法]
你一次性读取出来肯定是会很慢的呀
[解决办法]
看这里csv的部分内容是否对楼主有帮助
Code Project 上有篇文章,
A Fast CSV Reader
http://www.codeproject.com/KB/database/CsvReader.aspx

http://www.cnblogs.com/downmoon/archive/2009/01/15/1376693.html

http://blog.csdn.net/downmoon/archive/2009/01/17/3796026.aspx
[解决办法]
用file类试试,然后分拣出来
我原来试过几十万行的数据,很快的
[解决办法]
csv文件结构很简单的。你自己可以处理的。
使用文件结构读取就可以了。
你使用ue直接打开csv文件,看看里面的结构就明白了。
或者找个小的csv文件使用记事本打开。
[解决办法]
慢就是你的问题了吧
我经常超6w标准
给你超超我这个
包退包换
C# code
using System;using System.Collections;using System.Collections.Specialized;using System.Configuration;using System.Data;using System.Data.OleDb;using System.IO;using System.Text;using System.Web;using System.Web.UI;using System.Web.UI.HtmlControls;namespace ExcelObject{    internal class ExcelHelper{        private static FileStream oStream; //当前文件流         private static StreamWriter oWriter; //当前输出流         private static string strCurFileName; //使用组合函数输出Excel文件时使用的文件名          public static string GetExcelConnectionStr(string fileName){            return "provider=Microsoft.Jet.OLEDB.4.0"+";data source="+fileName                +";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";        }        public static string GetTextConnectionStr(string fileName){            string strPath=Path.GetDirectoryName(fileName);            return "Provider=Microsoft.Jet.OLEDB.4.0"+";Data Source="+strPath                +";Extended Properties=\"text;HDR=Yes;IMEX=1;\""; //FMT=Delimited;         }        public static DataSet GetDBFromTextFile(string fn){            string fileName=Path.GetFileName(fn);            string strSql="SELECT * From "+fileName;            string connStr=GetTextConnectionStr(fn);            var ds=new DataSet("DataSet1");            var oAdap=new OleDbDataAdapter(                strSql,                connStr);            oAdap.Fill(ds);            return ds;        }               public static DataSet GetDBFromExcel(string fileName,string strSql){            var ds=new DataSet("DataSet1");            string connStr=GetExcelConnectionStr(fileName);            var adap=new OleDbDataAdapter(                strSql,                connStr);            adap.Fill(ds);            return ds;        }                public static DataSet GetDBFromExcel(string fileName){            var ds=new DataSet("DataSet1");            int num=1;            while(true){                try{                    string strSql="SELECT * FROM [Sheet"+num+"$]";                    DataSet ds2=GetDBFromExcel(                        fileName,                        strSql);                    ds2.Tables[0].TableName="Table"+num;                    UpdateTableColumn(ds2.Tables[0]);                    ds.Merge(ds2);                    num++;                }                catch{                    break;                }            }            //清除数据             ClearNullData(ref ds);            return ds;        }               private static void UpdateTableColumn(DataTable dt){            if(dt==null){                return;            }            foreach(DataColumn col in dt.Columns){                col.ColumnName=col.ColumnName.Trim();            }        }                private static void ClearNullData(ref DataSet ds){            if(ds==null){                return ;            }            foreach(DataTable dt in ds.Tables){                //清空错误的列                 if(dt.Rows.Count==0){                    continue;                }                //清空错误的行                 var alRow=new ArrayList();                foreach(DataRow row in dt.Rows){                    if(IsNull(row)){                        alRow.Add(row);                    }                }                foreach(DataRow row in alRow){                    dt.Rows.Remove(row);                }            }            return ;        }               private static bool IsNull(DataRow row){            object[] items=row.ItemArray;            bool isNull=true;            foreach(object item in items){                if(item!=null                    &&item.ToString().Trim()!=""){                    isNull=false;                    break;                }            }            return isNull;        }              public static string GetTempDirectory(){            string directory=ConfigurationSettings.AppSettings["TempDirectory"];            if(!Directory.Exists(directory)){                Directory.CreateDirectory(directory);            }            return directory;        }                public static string GetTemplateDirectory(){            string directory=ConfigurationSettings.AppSettings["TemplateDirectory"];            return directory;        }        public static string GetTempFileName(string extName) {return GetTempDirectory()+@"\"+Math.Abs(Guid.NewGuid().ToString().GetHashCode())+extName;}              public static string GetTempFileName(string directory,string extName) {return directory+@"\"+Guid.NewGuid()+"."+extName;}                public static string SaveTempFile(HtmlInputFile fileUp){            string extName=Path.GetExtension(fileUp.PostedFile.FileName);            string tempFile=GetTempFileName(extName);            fileUp.PostedFile.SaveAs(tempFile);            return tempFile;        }             public static DataSet GetTempFileDB(HtmlInputFile fileUp){            //保存临时文件             string fn=SaveTempFile(fileUp);            DataSet ds=null;            //获取数据             if(IsTextFile(fn)){                ds=new DataSet("DataSet1");                DataTable dt=CSVToDataTable(fn);                dt.Rows.RemoveAt(0);                UpdateTableColumn(dt);                ds.Tables.Add(dt);            }            else{                ds=GetDBFromExcel(fn);            }            return ds;        } 


[解决办法]

C# code
        public static bool IsTextFile(string fileName){            string extName=Path.GetExtension(fileName).ToLower();            if(extName==".csv"                ||extName=="txt"){                return true;            }            return false;        }        public static string DataTableToCSV(DataTable dt,string title,ListDictionary ld,bool isShowDBColName,Page page){            string path=page.MapPath(HttpRuntime.AppDomainAppVirtualPath)+"/Temp/";            if(!Directory.Exists(path)){                Directory.CreateDirectory(path);            }            string fileName=Guid.NewGuid()+".csv";            FileStream oStream=File.Create(path+fileName);            var oWriter=new StreamWriter(                oStream,                Encoding.GetEncoding("GB2312"));            //保证不能超出Excel所能承受的最大行数             if(dt!=null                &&dt.Rows.Count>=65535){                oWriter.Write("请增加查询条件,减少导出数据量。Excel最大支持65535行数据!"+",");                oWriter.Write(oWriter.NewLine);                oWriter.Flush();                oWriter.Close();                oStream.Close();                return path+fileName;            }            //添加标题             oWriter.Write(title+",");            oWriter.Write(oWriter.NewLine);            //显示表的标题             if(ld!=null){                foreach(string name in ld.Values){                    oWriter.Write(name.Trim()+",");                }                oWriter.Write(oWriter.NewLine);            }            if(dt!=null){                //添加Column名称列                 if(isShowDBColName){                    foreach(string col in ld.Keys){                        oWriter.Write(col+",");                    }                    oWriter.Write(oWriter.NewLine);                }                //添加具体数据                 foreach(DataRow row in dt.Rows){                    foreach(string col in ld.Keys){                        string str=row[col].ToString().Trim().Replace(                            ",",                            "/");                        oWriter.Write(str+",");                    }                    oWriter.Write(oWriter.NewLine);                }            }            oWriter.Flush();            oWriter.Close();            oStream.Close();            return path+fileName;        }        public static string DataViewToCSV(DataView dv,string title,ListDictionary ld,bool isShowDBColName,Page page){            string path=page.MapPath(HttpRuntime.AppDomainAppVirtualPath)+"/Temp/";            if(!Directory.Exists(path)){                Directory.CreateDirectory(path);            }            string fileName=Guid.NewGuid()+".csv";            FileStream oStream=File.Create(path+fileName);            var oWriter=new StreamWriter(                oStream,                Encoding.GetEncoding("GB2312"));            //添加标题             oWriter.Write(title+",");            oWriter.Write(oWriter.NewLine);            //显示表的标题             if(ld!=null){                foreach(string name in ld.Values){                    oWriter.Write(name.Trim()+",");                }                oWriter.Write(oWriter.NewLine);            }            if(dv!=null){                //添加Column名称列                 if(isShowDBColName){                    foreach(string col in ld.Keys){                        oWriter.Write(col+",");                    }                    oWriter.Write(oWriter.NewLine);                }                //添加具体数据                 for(int i=0;                    i<dv.Count;                    i++){                    foreach(string col in ld.Keys){                        string str=dv[i][col].ToString().Trim();                        oWriter.Write(str+",");                    }                    oWriter.Write(oWriter.NewLine);                }            }            oWriter.Flush();            oWriter.Close();            oStream.Close();            return path+fileName;        }        #region 处理多个DataTable写入一个文件的函数组合         public static void BeginWrite(Page page){            string path=page.MapPath(HttpRuntime.AppDomainAppVirtualPath)+"/Temp/";            if(!Directory.Exists(path)){                Directory.CreateDirectory(path);            }            string fileName=Guid.NewGuid()+".csv";            strCurFileName=path+fileName;            oStream=File.Create(path+fileName);            oWriter=new StreamWriter(                oStream,                Encoding.GetEncoding("GB2312"));        }        public static void WriteTitle(string title){            //添加标题             oWriter.Write(title+",");            oWriter.Write(oWriter.NewLine);        }        public static void WriteContent(DataTable dt,ListDictionary ld,bool isShowDBColName){            if(dt!=null){                //添加Column名称列                 if(isShowDBColName){                    if(ld!=null){                        foreach(string name in ld.Values){                            oWriter.Write(name.Trim()+",");                        }                        oWriter.Write(oWriter.NewLine);                    }                }                //添加具体数据                 foreach(DataRow row in dt.Rows){                    foreach(string col in ld.Keys){                        string str=row[col].ToString().Trim();                        oWriter.Write(str+",");                    }                    oWriter.Write(oWriter.NewLine);                }            }        }        public static string EndWrite(){            oWriter.Flush();            oWriter.Close();            oStream.Close();            return strCurFileName;        }        #endregion        #region 使用StreamReader将CVS文件转化为一个DataTable         public static DataTable CSVToDataTable(string fn){            FileStream stream=File.Open(                fn,                FileMode.Open);            var reader=new StreamReader(                stream,                Encoding.GetEncoding("GB2312"));            string line="";            var dt=new DataTable("sadf");            while((line=reader.ReadLine())!=null){                string[] values=line.Split(',');                int count=dt.Columns.Count;                int addNum=values.Length-count;                if(addNum>0){                    AddColumn(                        dt,                        addNum);                }                DataRow row=dt.NewRow();                for(int num=0;                    num<values.Length;                    num++){                    row[num]=values[num];                }                dt.Rows.Add(row);            }            reader.Close();            stream.Close();            return dt;        }             public static void AddColumn(DataTable dt,int addNum){            int count=dt.Columns.Count;            for(int num=count-1;                num<count+addNum;                num++){                int colIndex=num+1;                var col=new DataColumn(                    colIndex.ToString(),                    typeof(string));                dt.Columns.Add(col);            }        }        #endregion    }} 


[解决办法]
这是导出为csv的代码 你参考下:

C# code
/// <summary>        /// 保存文件        /// </summary>        /// <param name="obj">DataGridView数据集</param>        /// <param name="sTitle">文件名</param>        /// <param name="bChart">是否包括图表</param>        /// <returns>导出成功与否</returns>        public bool Save(DataGridView obj, string sTitle, bool bChart)        {            if (object.Equals(obj, null))                return false;            if (obj.Columns.Count == 0 || obj.Rows.Count == 0)            {                MessageBox.Show("没有需要保存的数据", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);                return false;            }            SaveFileDialog dlg = new SaveFileDialog();            dlg.Title = "保存数据";            dlg.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv|TxT文件(*.txt)|*.txt";            dlg.FilterIndex = 1;            dlg.OverwritePrompt = true;            dlg.DefaultExt = "xls";            dlg.FileName = sTitle;            dlg.InitialDirectory = string.IsNullOrEmpty(sLastpath) ? Application.StartupPath : sLastpath;            if (dlg.ShowDialog() == DialogResult.OK)            {                Step(0);                sLastpath = dlg.FileName.Substring(0, dlg.FileName.LastIndexOf('\\'));                if (dlg.FilterIndex == 1)                {                    return SaveInExcel(obj, sTitle, dlg.FileName, bChart);                }                else                {                    using (Stream fs = dlg.OpenFile())                    {                        using (StreamWriter fw = new StreamWriter(fs))                        {                            StringBuilder st = new StringBuilder();                            List<int> indexList = new List<int>(obj.Columns.Count);                            for (int i = 0; i < obj.Columns.Count; i++)                            {                                indexList.Insert(obj.Columns[i].DisplayIndex, i);                            }                            Step(5);                            foreach (var i in indexList)                            {                                st.Append(obj.Columns[i].HeaderText + "\t");                            }                            fw.WriteLine(st);                            Step(10);                            StringBuilder sc = null;                            for (int i = 0; i < obj.Rows.Count; i++)                            {                                sc = new StringBuilder();                                foreach (var j in indexList)                                {                                    sc.Append(obj.Rows[i].Cells[j].Value.ToString() + "\t");                                }                                Step(90 / obj.Rows.Count * i);                                fw.WriteLine(sc);                                sc = null;                            }                        }                    }                    Step(100);                    return true;                }            }            return false;        }
[解决办法]
探讨
引用:
看这里csv的部分内容是否对楼主有帮助
Code Project 上有篇文章,
A Fast CSV Reader
http://www.codeproject.com/KB/database/CsvReader.aspx

http://www.cnblogs.com/downmoon/archive/2009/01/15/1376693.ht……

[解决办法]
头3行是说明肯定不行啊,你试着把第2、3行最前面用“#”注释掉看能读到DGV里头不。

CachedCsvReader(new StreamReader(string), true|false))
第2个参数选择true意思就是第一个非注释行解析为字段名,剩下的从第二行开始都为该字段下的数据了,你前3行都是说明肯定出错了,试着用#注释掉再看看。

CsvReader这个类库灵活性不是很高,主推的就是读取速度…… A Fast CSV Reader



[解决办法]
读取慢的话,你可以使用多线程,同时读取一个文件,
这样,速度可以快很多的。
如果你的机器性能好的话,可以更快的。
建议至少同时开启5个以上的线程,同时读取文件中连续的不同的数据就行了。
文件要使用共享模式打开,不然的话,不可以同时读取
[解决办法]
有个大牛破解了一个你需要那个 需要pm

读书人网 >C#

热点推荐