Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将大型数据表数据导出到c#windows应用程序中的.csv文件_C#_Mysql_Winforms - Fatal编程技术网

将大型数据表数据导出到c#windows应用程序中的.csv文件

将大型数据表数据导出到c#windows应用程序中的.csv文件,c#,mysql,winforms,C#,Mysql,Winforms,我需要将大型数据表(>50个LAC(5M)数据行)导出到.csv文件 我正在使用下面的代码,但它需要很长时间 public void CreateCSVFile(DataTable dtDataTablesList, string strFilePath) { // Create the CSV file to which grid data will be exported. StreamWriter sw = new StreamWriter(strFilePath, fal

我需要将大型
数据表
(>50个LAC(5M)数据行)导出到
.csv
文件

我正在使用下面的代码,但它需要很长时间

public void CreateCSVFile(DataTable dtDataTablesList, string strFilePath)
{
    // Create the CSV file to which grid data will be exported.
    StreamWriter sw = new StreamWriter(strFilePath, false);
    //First we will write the headers.
    int iColCount = dtDataTablesList.Columns.Count;
    for (int i = 0; i < iColCount; i++)
    {
        sw.Write(dtDataTablesList.Columns[i]);
        if (i < iColCount - 1)
        {
            sw.Write("", "");
        }
    }
    sw.Write(sw.NewLine);

    // Now write all the rows.
    foreach (DataRow dr in dtDataTablesList.Rows)
    {
        for (int i = 0; i < iColCount; i++)
        {
            if (!Convert.IsDBNull(dr[i]))
            {
                sw.Write(dr[i].ToString());
            }
            if (i < iColCount - 1)
            {
                sw.Write("", "");
            }
        }
        sw.Write(sw.NewLine);
    }
    sw.Close();
}
public void CreateCSVFile(数据表dtDataTablesList,字符串strFilePath)
{
//创建要将栅格数据导出到的CSV文件。
StreamWriter sw=新StreamWriter(strFilePath,false);
//首先,我们将编写标题。
int iColCount=dtDataTablesList.Columns.Count;
对于(int i=0;i

请告诉我任何其他快速操作的方法。

考虑将OLEDB连接与连接字符串一起使用,例如

“Provider=Microsoft.Jet.OLEDB.4.0;数据源=c:\txtFilesFolder\;Extended Properties=“text;HDR=是;FMT=分隔符”

CSV文件和分隔符有一些规则,您应该特别小心处理引号、制表符、逗号、换行符等字符。有关此类规则的更多详细信息,请参阅

UPD:尝试增加文件流缓冲区:

using(var stream = new FileStream(path,FileMode.Create,FileAccess.Write,FileShare.None,4*1024*1024))
{
  // your code referencing stream in StreamWriter()
}
您还可以在StreamWriter构造函数中指定更大的缓冲区大小。
要提高性能,没有什么其他方法可以做-StreamWriter已经足够快了,标准类型的ToString()也相当不错。我怀疑您是否在那里输出用户类型,但如果您这样做,请验证它们的ToString()是否正确方法足够有效。其他一切都超出了您的控制范围。

一种可能的加速方法是使用StringBuilder并在StringBuilder中附加1K记录数据,然后将其写入sw.write()

因此,您的逻辑应该是先在SB中写入1000条记录,然后在SW中写入

这肯定会提高性能

如果你用10K增加1000个记录,并按照我的说法测试性能,会更好


希望这有帮助。

而不是调用<代码>流写器。写(…)< /代码>您可能会考虑<强>使用StrugBuilder 。将所有字符串附加到生成器并只在磁盘上写入一次!


我对您的代码进行了一些修改,使用
StringBuilder
作为缓冲区。这需要更多的RAM,但效率应该更高。请使用初始容量和最大容量,以避免
OutOfMemoryException
并获得最大效率:

public void CreateFastCSVFile(DataTable table, string strFilePath)
{
    const int capacity = 5000000;
    const int maxCapacity = 20000000;

    //First we will write the headers.
    StringBuilder csvBuilder = new StringBuilder(capacity);
    csvBuilder.AppendLine(string.Join(",", table.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));

    // Create the CSV file and write all from StringBuilder
    using (var sw = new StreamWriter(strFilePath, false))
    {
        foreach (DataRow dr in table.Rows)
        {
            if (csvBuilder.Capacity >= maxCapacity)
            {
                sw.Write(csvBuilder.ToString());
                csvBuilder = new StringBuilder(capacity);
            }
            csvBuilder.Append(String.Join(",", dr.ItemArray));
        }
        sw.Write(csvBuilder.ToString());
    }
}

这是我的最终解决方案

使用此代码,我们可以在不到2分钟的时间内将50万条记录导出到csv文件。 这里我使用datareader而不是datatable

private void button1_Click(object sender, EventArgs e)
    {

        Stopwatch swra = new Stopwatch();
        swra.Start();
        string NewconnectionString = "myCoonectionString";
        StreamWriter CsvfileWriter = new StreamWriter(@"D:\testfile.csv");
        string sqlselectQuery = "select * from Mytable";
        SqlCommand sqlcmd = new SqlCommand();

        SqlConnection spContentConn = new SqlConnection(NewconnectionString);
        sqlcmd.Connection = spContentConn;
        sqlcmd.CommandTimeout = 0;
        sqlcmd.CommandType = CommandType.Text;
        sqlcmd.CommandText = sqlselectQuery;
        spContentConn.Open();
        using (spContentConn)
        {
            using (SqlDataReader sdr = sqlcmd.ExecuteReader())
            using (CsvfileWriter)
            {
                //For getting the Table Headers
                DataTable Tablecolumns = new DataTable();

                for (int i = 0; i < sdr.FieldCount; i++)
                {
                    Tablecolumns.Columns.Add(sdr.GetName(i));
                }
                CsvfileWriter.WriteLine(string.Join(",", Tablecolumns.Columns.Cast<datacolumn>().Select(csvfile => csvfile.ColumnName)));
                //For table headers

                while (sdr.Read())
                //based on your columns
                    YourWriter.WriteLine(sdr[0].ToString() + "," + sdr[1].ToString() + "," + sdr[2].ToString() + "," + sdr[3].ToString() + "," + sdr[4].ToString() + "," + sdr[5].ToString() + "," + sdr[6].ToString() + "," + sdr[7].ToString() + "," + sdr[8].ToString() + "," + sdr[9].ToString() + "," + sdr[10].ToString() + "," + sdr[11].ToString() + ",");

            }
        }
       swra.Stop();
Console.WriteLine(swra.ElapsedMilliseconds);
}
private void按钮1\u单击(对象发送者,事件参数e)
{
秒表swra=新秒表();
swra.Start();
string NewconnectionString=“myconctionString”;
StreamWriter CsvfileWriter=新的StreamWriter(@“D:\testfile.csv”);
字符串sqlselectQuery=“从Mytable中选择*”;
SqlCommand sqlcmd=新的SqlCommand();
SqlConnection spContentConn=newsqlconnection(NewconnectionString);
sqlcmd.Connection=spContentConn;
sqlcmd.CommandTimeout=0;
sqlcmd.CommandType=CommandType.Text;
sqlcmd.CommandText=sqlselectQuery;
spContentConn.Open();
使用(spContentConn)
{
使用(SqlDataReader sdr=sqlcmd.ExecuteReader())
使用(CsvfileWriter)
{
//用于获取表标题
DataTableColumns=新DataTable();
对于(int i=0;icsvfile.ColumnName));
//对于表标题
while(sdr.Read())
//根据你的专栏
YourWriter.WriteLine(sdr[0].ToString()+”,“+sdr[1].ToString()+”,“+sdr[2].ToString()+”,“+sdr[3].ToString()+”,“+sdr[4].ToString()+”,“+sdr[5].ToString()+”,“+sdr[6].ToString()+”,“+sdr[7].ToString()+,“,+sdr[8];
}
}
swra.Stop();
控制台写入线(swra.ElapsedMilliseconds);
}

谢谢大家。

@JohnWoo他要求从数据库中以CSV格式写入数据。上面应该可以用吗?我相信它是CSV读取器…系统挂起,我无法在这里测量时间,但10万条记录插入了2分钟。我相信问题在于写入CSV文件的速度太慢,无法连接到数据源。@darrendavise是否当前的实现非常容易出错?如果问题容易出错,那么为什么要将OP引导到连接字符串?@DarrenDavies,因为OleDriver能够处理带有分隔符、引号和CRLF等字符的数据值,因此不必在代码中解决。此外,他们可能很清楚最佳性能ce tuning.StringBuilder将在内存中保存整个内容,然后将创建另一个相同大小的内存块。它可能适合18Mb甚至50Mb,但当达到200Mb或更大时,它将成为一个令人头痛的问题。StreamWriter没有此类问题。它只需要足够大的缓冲区,以减少写入操作的频率。
public void CreateFastCSVFile(DataTable table, string strFilePath)
{
    const int capacity = 5000000;
    const int maxCapacity = 20000000;

    //First we will write the headers.
    StringBuilder csvBuilder = new StringBuilder(capacity);
    csvBuilder.AppendLine(string.Join(",", table.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));

    // Create the CSV file and write all from StringBuilder
    using (var sw = new StreamWriter(strFilePath, false))
    {
        foreach (DataRow dr in table.Rows)
        {
            if (csvBuilder.Capacity >= maxCapacity)
            {
                sw.Write(csvBuilder.ToString());
                csvBuilder = new StringBuilder(capacity);
            }
            csvBuilder.Append(String.Join(",", dr.ItemArray));
        }
        sw.Write(csvBuilder.ToString());
    }
}
var TblData = new DataTable();
TblData.Columns.Add("FeeID", typeof(int));
TblData.Columns.Add("Amount", typeof(int));
TblData.Columns.Add("FeeItem", typeof(string));
TblData.Columns.Add("Type", typeof(char));
for (int i = 0; i < 1000000; i++)
{
    TblData.Rows.Add(9, 8500, "Admission Free", 'T');
    TblData.Rows.Add(9, 950, "Annual Fee", 'T');
    TblData.Rows.Add(9, 150, "Application Free", 'T');
    TblData.Rows.Add(9, 850, "Boy's Uniform", DBNull.Value);
    TblData.Rows.Add(9, 50, DBNull.Value, 'R');
    TblData.Rows.Add(10, 7500, "Admission Free", 'T');
    TblData.Rows.Add(11, 900, "Annual Fee", 'T');
    TblData.Rows.Add(11, 150, "Application Free", 'T');
    TblData.Rows.Add(11, 850, DBNull.Value, 'T');
    TblData.Rows.Add(11, 50, "Computer Free", 'R');
}
int rowCount = TblData.Rows.Count; // 10000000
var watch = new System.Diagnostics.Stopwatch();
watch.Start();
CreateFastCSVFile(TblData, @"C:\Temp\TestCSV.csv");
watch.Stop();
Console.Write("Elapsed: {0}", watch.Elapsed); // 00:00:26 for 207 MB CSV-file
private void button1_Click(object sender, EventArgs e)
    {

        Stopwatch swra = new Stopwatch();
        swra.Start();
        string NewconnectionString = "myCoonectionString";
        StreamWriter CsvfileWriter = new StreamWriter(@"D:\testfile.csv");
        string sqlselectQuery = "select * from Mytable";
        SqlCommand sqlcmd = new SqlCommand();

        SqlConnection spContentConn = new SqlConnection(NewconnectionString);
        sqlcmd.Connection = spContentConn;
        sqlcmd.CommandTimeout = 0;
        sqlcmd.CommandType = CommandType.Text;
        sqlcmd.CommandText = sqlselectQuery;
        spContentConn.Open();
        using (spContentConn)
        {
            using (SqlDataReader sdr = sqlcmd.ExecuteReader())
            using (CsvfileWriter)
            {
                //For getting the Table Headers
                DataTable Tablecolumns = new DataTable();

                for (int i = 0; i < sdr.FieldCount; i++)
                {
                    Tablecolumns.Columns.Add(sdr.GetName(i));
                }
                CsvfileWriter.WriteLine(string.Join(",", Tablecolumns.Columns.Cast<datacolumn>().Select(csvfile => csvfile.ColumnName)));
                //For table headers

                while (sdr.Read())
                //based on your columns
                    YourWriter.WriteLine(sdr[0].ToString() + "," + sdr[1].ToString() + "," + sdr[2].ToString() + "," + sdr[3].ToString() + "," + sdr[4].ToString() + "," + sdr[5].ToString() + "," + sdr[6].ToString() + "," + sdr[7].ToString() + "," + sdr[8].ToString() + "," + sdr[9].ToString() + "," + sdr[10].ToString() + "," + sdr[11].ToString() + ",");

            }
        }
       swra.Stop();
Console.WriteLine(swra.ElapsedMilliseconds);
}