C# winform 读取csv文件 问题

wy811007 2011-01-03 12:24:36
我要做个小项目。
读取csv文件 我测试的文件1000行 代码加载很快。
但是加载一个3M大小的 3W行 代码 就卡住了。。
有谁能解决啊。。
我读取只从网上找的一个读写类。。


#region 类说明信息
/// <summary>
/// <DL>
/// <DT><b>读CSV文件类,读取指定的CSV文件,可以导出DataTable</b></DT>
/// <DD>
/// <UL>
/// </UL>
/// </DD>
/// </DL>
/// <Author>yangzhihong</Author>
/// <CreateDate>2006/01/16</CreateDate>
/// <Company></Company>
/// <Version>1.0</Version>
/// </summary>
#endregion
public class CsvStreamReader
{
private ArrayList rowAL; //行链表,CSV文件的每一行就是一个链
private string fileName; //文件名
private Encoding encoding; //编码

public CsvStreamReader()
{
this.rowAL = new ArrayList();
this.fileName = "";
this.encoding = Encoding.Default;
}

/// <summary>
///
/// </summary>
/// <param name="fileName">文件名,包括文件路径</param>
public CsvStreamReader(string fileName)
{
this.rowAL = new ArrayList();
this.fileName = fileName;
this.encoding = Encoding.Default;
LoadCsvFile();
}

/// <summary>
///
/// </summary>
/// <param name="fileName">文件名,包括文件路径</param>
/// <param name="encoding">文件编码</param>
public CsvStreamReader(string fileName, Encoding encoding)
{
this.rowAL = new ArrayList();
this.fileName = fileName;
this.encoding = encoding;
LoadCsvFile();
}

/// <summary>
/// 文件名,包括文件路径
/// </summary>
public string FileName
{
get
{
return fileName;
}
set
{
this.fileName = value;
LoadCsvFile();
}
}

/// <summary>
/// 文件编码
/// </summary>

public Encoding FileEncoding
{
set
{
this.encoding = value;
}
}

/// <summary>
/// 根据最小行,最大行,最小列,最大列,来生成一个DataTable类型的数据

/// 行等于1代表第一行

/// 列等于1代表第一列

/// maxrow: -1代表最大行
/// maxcol: -1代表最大列
/// </summary>
public DataTable this[int minRow, int maxRow, int minCol, int maxCol]
{
get
{
//数据有效性验证

CheckRowValid(minRow);
CheckMaxRowValid(maxRow);
CheckColValid(minCol);
CheckMaxColValid(maxCol);
if (maxRow == -1)
{
maxRow = RowCount;
}
if (maxCol == -1)
{
maxCol = ColCount;
}
if (maxRow < minRow)
{
throw new Exception("最大行数不能小于最小行数");
}
if (maxCol < minCol)
{
throw new Exception("最大列数不能小于最小列数");
}
DataTable csvDT = new DataTable();
int i;
int col;
int row;

//增加列

for (i = minCol; i <= maxCol; i++)
{
csvDT.Columns.Add(i.ToString());
}
for (row = minRow; row <= maxRow; row++)
{
DataRow csvDR = csvDT.NewRow();

i = 0;
for (col = minCol; col <= maxCol; col++)
{
csvDR[i] = this[row, col];
i++;
}
csvDT.Rows.Add(csvDR);
}

return csvDT;
}
}

/// <summary>
/// 载入CSV文件
/// </summary>
private void LoadCsvFile()
{
//对数据的有效性进行验证

if (this.fileName == null)
{
throw new Exception("请指定要载入的CSV文件名");
}
else if (!File.Exists(this.fileName))
{
throw new Exception("指定的CSV文件不存在");
}
else
{
}
if (this.encoding == null)
{
this.encoding = Encoding.Default;
}

StreamReader sr = new StreamReader(this.fileName, this.encoding);
string csvDataLine;

csvDataLine = "";
while (true)
{
string fileDataLine;

fileDataLine = sr.ReadLine();
if (fileDataLine == null)
{
break;
}
if (csvDataLine == "")
{
csvDataLine = fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
}
else
{
csvDataLine += "\r\n" + fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
}
//如果包含偶数个引号,说明该行数据中出现回车符或包含逗号
if (!IfOddQuota(csvDataLine))
{
AddNewDataLine(csvDataLine);
csvDataLine = "";
}
}
sr.Close();
//数据行出现奇数个引号
if (csvDataLine.Length > 0)
{
throw new Exception("CSV文件的格式有错误");
}
}

}

代码太多 我删了一部分。
...全文
741 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sa20121221 2011-01-07
  • 打赏
  • 举报
回复
up。。难道没人会么。 我也想用这个 但是弄不进去
足球中国 2011-01-03
  • 打赏
  • 举报
回复
wy811007 2011-01-03
  • 打赏
  • 举报
回复
哪有开源项目。。
xuld 2011-01-03
  • 打赏
  • 举报
回复
代码效率很低,

可以找开源的项目
wy811007 2011-01-03
  • 打赏
  • 举报
回复
真纠结 自己在这里找了个 还算可以蛮快的 很好用
http://www.csvreader.com
wy811007 2011-01-03
  • 打赏
  • 举报
回复
高手 来帮忙下啊。。

using System.IO;
using LumenWorks.Framework.IO.Csv;

void ReadCsv()
{
// open the file "data.csv" which is a CSV file with headers
using (CachedCsvReader csv = new
CachedCsvReader(new StreamReader("data.csv"), true))
{
// Field headers will automatically be used as column names
myDataGrid.DataSource = csv;
}
}


这个csv 要怎么用啊。。纠结哦
wy811007 2011-01-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyq11 的回复:]
大数量不要一次性读取,读取一定数据后再处理再读取
那行代码,重复了
[/Quote]

那如果用我自己找的那个代码 我应该怎么改下呢。
3L给的那个 unbelievable啊。 老报错。我就郁闷了。
wuyq11 2011-01-03
  • 打赏
  • 举报
回复
大数量不要一次性读取,读取一定数据后再处理再读取
那行代码,重复了
wy811007 2011-01-03
  • 打赏
  • 举报
回复
自己 up 我用3L给的那个 老提示上面那句话 怎么回事啊 纠结了。。
wy811007 2011-01-03
  • 打赏
  • 举报
回复
老提示 已添加了具有相同键的项
wy811007 2011-01-03
  • 打赏
  • 举报
回复
3L 这个 怎么用啊 郁闷。弄半天没整好。 纠结

110,535

社区成员

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

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

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