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

wy811007 2011-01-03 10:05:10
前一帖子三连了。 我去 倒霉csv还没搞好 我就郁闷了。。
之前我用的第一个方法 读大文件会卡掉。
后来有个朋友找了个
http://www.codeproject.com/KB/database/CsvReader.aspx
快速读取
我弄半天搞不懂。。

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

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

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

求救啊 大侠们 速度了。。多给分
...全文
1896 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我也想要,谁有呢,发给我好了
xk330cool 2012-05-17
  • 打赏
  • 举报
回复
也想来一个破解版的!!!
wy811007 2011-10-27
  • 打赏
  • 举报
回复
唉 最后还是用的自己写的方法 不过后来一个大牛给了个破解版的 偷笑.
现在结贴
sa20121221 2011-07-29
  • 打赏
  • 举报
回复
有个大牛破解了一个你需要那个 需要pm
wy811007 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 mjp1234airen4385 的回复:]
读取慢的话,你可以使用多线程,同时读取一个文件,
这样,速度可以快很多的。
如果你的机器性能好的话,可以更快的。
建议至少同时开启5个以上的线程,同时读取文件中连续的不同的数据就行了。
文件要使用共享模式打开,不然的话,不可以同时读取
[/Quote]
额 没用过多线程 到底什么意思捏 。。
云海玉弓缘 2011-01-10
  • 打赏
  • 举报
回复
这个错误是你的CSV文件里有相同的列名,你可以自己创建一个简单的csv文件读取测试下嘛。
A,B,C,D,E, F,G
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
mjp1234airen4385 2011-01-10
  • 打赏
  • 举报
回复
读取慢的话,你可以使用多线程,同时读取一个文件,
这样,速度可以快很多的。
如果你的机器性能好的话,可以更快的。
建议至少同时开启5个以上的线程,同时读取文件中连续的不同的数据就行了。
文件要使用共享模式打开,不然的话,不可以同时读取
wy811007 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 iraya 的回复:]
引用 16 楼 wy811007 的回复:
引用 13 楼 peterb 的回复:
看这里csv的部分内容是否对楼主有帮助
Code Project 上有篇文章,
A Fast CSV Reader
http://www.codeproject.com/KB/database/CsvReader.aspx

http://www.cnblogs.com/downmoon/archiv……
[/Quote]
我就这样用的

void ReadCsvs()
{
if (File.Exists(this.tb_list.Text.Trim()))
{
// open the file "data.csv" which is a CSV file with headers
using (CachedCsvReader csv = new
CachedCsvReader(new StreamReader(tb_list.Text), true))
{
// Field headers will automatically be used as column names
dgv_show.DataSource = csv;
}
}
else
{
MessageBox.Show("文件名不能为空或文件不存在");
return;
}
}

但是提示 这个报错。 就是出不来数据。。喵了个咪的
云海玉弓缘 2011-01-10
  • 打赏
  • 举报
回复
头3行是说明肯定不行啊,你试着把第2、3行最前面用“#”注释掉看能读到DGV里头不。

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

CsvReader这个类库灵活性不是很高,主推的就是读取速度…… A Fast CSV Reader
wy811007 2011-01-10
  • 打赏
  • 举报
回复
所以我说要用datatable 来读出来 。。 因为我那个csv文件 头三行 是说明。有空格的

但是上面这个方法 我不知道他csv返回的是啥东西。。愁了。。。

到底你们都说用这个开源的好 真正有谁用过 读取出来东西呢。

来个例子我看看。。
wy811007 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yuwenge 的回复:]
cvs只是一个简单的txt文件。把后缀名改为.txt,你就可以看到具体格式了。
读写方法和文本文件没有任何区别。
[/Quote]
问题要按 "","","" 拆分 而且数据量大 你的明白 3W行的文件3M大小 如果方法不得当 会卡s的。
-小蕾- 2011-01-06
  • 打赏
  • 举报
回复
这是导出为csv的代码 你参考下:

/// <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;
}
phoebuswei 2011-01-06
  • 打赏
  • 举报
回复

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
}
}
phoebuswei 2011-01-06
  • 打赏
  • 举报
回复
慢就是你的问题了吧
我经常超6w标准
给你超超我这个
包退包换

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;
}

wy811007 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mjp1234airen4385 的回复:]
csv文件结构很简单的。你自己可以处理的。
使用文件结构读取就可以了。
你使用ue直接打开csv文件,看看里面的结构就明白了。
或者找个小的csv文件使用记事本打开。
[/Quote]
文件结构 我明白。"","","","" 这样分割的不是么。
但是我的文件很大3M左右 每个行数都3W 用简单的方法读取很慢。。我要找个读取快点的啊。
wy811007 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 peterb 的回复:]
看这里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.cs……
[/Quote]
我做的是winform 程序。。 您找的第一个 也有人给我介绍了 并且我也在Code Project找到了
但是 不会用
http://topic.csdn.net/u/20110103/12/40bdf9e5-a9f2-4dfa-b325-6da493e084e9.html
看这帖10L 我发的代码 用那个第一个的dll我倒是能读到 但是不知道怎么用那个csv。。
他不能导入到我的 datagridview 就是绑定不能啊。。
mjp1234airen4385 2011-01-06
  • 打赏
  • 举报
回复
csv文件结构很简单的。你自己可以处理的。
使用文件结构读取就可以了。
你使用ue直接打开csv文件,看看里面的结构就明白了。
或者找个小的csv文件使用记事本打开。
王顺起 2011-01-06
  • 打赏
  • 举报
回复
用file类试试,然后分拣出来
我原来试过几十万行的数据,很快的
peterb 2011-01-06
  • 打赏
  • 举报
回复
看这里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
卧_槽 2011-01-06
  • 打赏
  • 举报
回复
cvs只是一个简单的txt文件。把后缀名改为.txt,你就可以看到具体格式了。
读写方法和文本文件没有任何区别。
加载更多回复(13)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧