数据表到多个CSV文件

时间:2016-04-19 06:14:46

标签: c# sql-server csv datatable stringbuilder

我从SQL Server 2012表中获取一些记录。为此,我使用了DataTable。我想将获取的记录写入multiple CSV files

我已使用StringBuilder将列标题和字段写入CSV文件(单个CSV文件)。

但是,现在新的要求是首先根据列过滤记录,然后写入多个文件。

  1. 假设我有5列col1col2col3col4col5
  2. 我需要将col1col2col5写入一次CSV文件,然后将col1col3col4写入另一个CSV文件。
  3. 我还希望列一列 - col0作为第一列,它将通过代码添加,并且不存在于数据库中。此列将来自col3col5。像这样的东西:

    dt.Columns.Add(“col0”,typeof(System.String))。SetOrdinal(0);

    row [“col0”] = row [“col3”] +“_”+ row [“col5”];

  4. 第3点的问题是我无法派生col0,除非我从数据表(dt)中获取两行 - col3col5。它给了我错误

  5.   

    System.ArgumentException:列'col3'不属于表Selected。

    请让我知道如何继续?

    代码:

    public static void CreateCSVFile(DataTable dt, string CSVPath, string CSVFileName, int FileSize)
    {
        StringBuilder FirstLine = new StringBuilder();
        StringBuilder records = new StringBuilder();
    
        int num = 0;
        int length = 0;
    
        dt.Columns.Add("Update", typeof(System.String)).SetOrdinal(0);
        dt.Columns.Add("Key", typeof(System.String)).SetOrdinal(1);
    
        IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName);
        FirstLine.Append(string.Join(",", columnNames));
        records.AppendLine(FirstLine.ToString());
        length += records.ToString().Length;
    
        int lastindex = dt.Rows.Count;
        foreach (var row1 in dt.Rows.Cast<DataRow>().Select((r, i) => new { Row = r, Index = i }))
        {
            DataRow row = row1.Row;
            row["Update"] = "Update";
            row["Key"] = row["Name"] + "_" + row["Code"];
    
            //Putting field values in double quotes
            IEnumerable<string> fields = row.ItemArray.Select(field =>
                string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
    
            records.AppendLine(string.Join(",", fields));
            length += records.ToString().Length;
    
            if (length > FileSize)
            {
                //Create a new file
                num++;
                File.WriteAllText(CSVPath + CSVFileName + DateTime.Now.ToString("yyyyMMddHHmmss") + num.ToString("_000") + ".csv", records.ToString());
                records.Clear();
                length = 0;
                records.AppendLine(FirstLine.ToString());
                length += records.ToString().Length;
            }
            else if (row1.Index == lastindex - 1 && length != 0 && length < FileSize)
            {
                //Create a new file
                num++;
                File.WriteAllText(CSVPath + CSVFileName + DateTime.Now.ToString("yyyyMMddHHmmss") + num.ToString("_000") + ".csv", records.ToString());
                records.Clear();
                length = 0;
                records.AppendLine(FirstLine.ToString());
                length += records.ToString().Length;
            }
        }
    }
    

0 个答案:

没有答案