如何高效地将大量数据从CSV文件导入DataGridView
How to import large amounts of data from CSV file to DataGridView efficiently
我有 300 个 csv 文件,每个文件包含 18000 行和 27 列。
现在,我想制作一个 windows 表单应用程序,将它们导入并显示在数据网格视图中,稍后再进行一些数学运算。
但是,我的表现很低效...
通过 google 搜索此问题后,我找到了解决方案 "A Fast CSV Reader"。
(http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader)
我按照代码一步一步来,但是我的datagridview还是空的。
我不知道如何解决这个问题。
任何人都可以告诉我该怎么做或给我另一种有效读取 csv 的更好方法。
这是我的代码...
using System.IO;
using LumenWorks.Framework.IO.Csv;
private void Form1_Load(object sender, EventArgs e)
{
ReadCsv();
}
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
dataGridView1.DataSource = csv;
}
}
这是我的输入数据:
https://dl.dropboxusercontent.com/u/28540219/20130102.csv
谢谢...
你也可以这样做
private void ReadCsv()
{
string filePath = @"C:\..130102.csv";
FileStream fileStream = null;
try
{
fileStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
}
catch (Exception ex)
{
return;
}
DataTable table = new DataTable();
bool isColumnCreated = false;
using (StringReader reader = new StringReader(new StreamReader(fileStream, Encoding.Default).ReadToEnd()))
{
while (reader.Peek() != -1)
{
string line = reader.ReadLine();
if (line == null || line.Length == 0)
continue;
string[] values = line.Split(',');
if(!isColumnCreated)
{
for(int i=0; i < values.Count(); i++)
{
table.Columns.Add("Column" + i);
}
isColumnCreated = true;
}
DataRow row = table.NewRow();
for(int i=0; i < values.Count(); i++)
{
row[i] = values[i];
}
table.Rows.Add(row);
}
}
dataGridView1.DataSource = table;
}
根据您的性能要求,可以即兴创作此代码。它只是一个供您参考的工作示例。
我希望这能给一些想法。
您提供的数据不包含headers(第一行是数据行)。因此,当我尝试将 csv reader 添加到 DataSource 时,我得到了一个 ArgumentException(添加了相同键的项目)。在 CachCsvReader 构造函数中设置 hasHeaders
参数就可以了,它将数据添加到 DataGridView(非常快)。
using (CachedCsvReader csv = new CachedCsvReader(new StreamReader("data.csv"), false))
{
dataGridView.DataSource = csv;
}
希望对您有所帮助!
我有 300 个 csv 文件,每个文件包含 18000 行和 27 列。
现在,我想制作一个 windows 表单应用程序,将它们导入并显示在数据网格视图中,稍后再进行一些数学运算。
但是,我的表现很低效...
通过 google 搜索此问题后,我找到了解决方案 "A Fast CSV Reader"。 (http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader)
我按照代码一步一步来,但是我的datagridview还是空的。
我不知道如何解决这个问题。
任何人都可以告诉我该怎么做或给我另一种有效读取 csv 的更好方法。
这是我的代码...
using System.IO;
using LumenWorks.Framework.IO.Csv;
private void Form1_Load(object sender, EventArgs e)
{
ReadCsv();
}
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
dataGridView1.DataSource = csv;
}
}
这是我的输入数据: https://dl.dropboxusercontent.com/u/28540219/20130102.csv
谢谢...
你也可以这样做
private void ReadCsv()
{
string filePath = @"C:\..130102.csv";
FileStream fileStream = null;
try
{
fileStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
}
catch (Exception ex)
{
return;
}
DataTable table = new DataTable();
bool isColumnCreated = false;
using (StringReader reader = new StringReader(new StreamReader(fileStream, Encoding.Default).ReadToEnd()))
{
while (reader.Peek() != -1)
{
string line = reader.ReadLine();
if (line == null || line.Length == 0)
continue;
string[] values = line.Split(',');
if(!isColumnCreated)
{
for(int i=0; i < values.Count(); i++)
{
table.Columns.Add("Column" + i);
}
isColumnCreated = true;
}
DataRow row = table.NewRow();
for(int i=0; i < values.Count(); i++)
{
row[i] = values[i];
}
table.Rows.Add(row);
}
}
dataGridView1.DataSource = table;
}
根据您的性能要求,可以即兴创作此代码。它只是一个供您参考的工作示例。
我希望这能给一些想法。
您提供的数据不包含headers(第一行是数据行)。因此,当我尝试将 csv reader 添加到 DataSource 时,我得到了一个 ArgumentException(添加了相同键的项目)。在 CachCsvReader 构造函数中设置 hasHeaders
参数就可以了,它将数据添加到 DataGridView(非常快)。
using (CachedCsvReader csv = new CachedCsvReader(new StreamReader("data.csv"), false))
{
dataGridView.DataSource = csv;
}
希望对您有所帮助!