【发布时间】:2016-04-06 08:19:37
【问题描述】:
大家好,我有一个函数,它将 DataTable 中的 smaller chunks based on size 中的 create multiple CSV files 通过 app.config 键/值对传递。
以下代码的问题:
- 我已将文件大小硬编码为 1 kb,当我将传递
20的值时,它应该创建20kb的 csv 文件。目前它正在为相同的值创建5kb的文件大小。 - 对于最后剩下的记录,它没有创建任何文件。
请帮我解决这个问题。谢谢!
代码:
public static void CreateCSVFile(DataTable dt, string CSVFileName)
{
int size = Int32.Parse(ConfigurationManager.AppSettings["FileSize"]);
size *= 1024; //1 KB size
string CSVPath = ConfigurationManager.AppSettings["CSVPath"];
StringBuilder FirstLine = new StringBuilder();
StringBuilder records = new StringBuilder();
int num = 0;
int length = 0;
IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName);
FirstLine.AppendLine(string.Join(",", columnNames));
records.AppendLine(FirstLine.ToString());
length += records.ToString().Length;
foreach (DataRow row in dt.Rows)
{
//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 > size)
{
//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());
}
}
}
【问题讨论】:
-
我宁愿直接从
DataTable以指定文件大小的较小块直接写入CSV Files。我无法写下所有的记录。If条件只查找length > size,因此它会留下最后留下的记录,而不是为这些记录创建任何文件。
标签: c# file csv header tableheader