我从SQL Server 2012
表中获取一些记录。为此,我使用了DataTable
。我想将获取的记录写入multiple CSV files
。
我已使用StringBuilder
将列标题和字段写入CSV文件(单个CSV文件)。
但是,现在新的要求是首先根据列过滤记录,然后写入多个文件。
col1
,col2
,col3
,col4
和col5
。 col1
,col2
和col5
写入一次CSV文件,然后将col1
,col3
和col4
写入另一个CSV文件。 我还希望列一列 - col0
作为第一列,它将通过代码添加,并且不存在于数据库中。此列将来自col3
和col5
。像这样的东西:
dt.Columns.Add(“col0”,typeof(System.String))。SetOrdinal(0);
row [“col0”] = row [“col3”] +“_”+ row [“col5”];
第3点的问题是我无法派生col0
,除非我从数据表(dt)中获取两行 - col3
和col5
。它给了我错误
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;
}
}
}