我正在从数据库值构建csv文件。当我在excel中打开csv时,一切都在一行上。为了解决这个问题,我在每一行之后添加了\n
或\r
。现在,当我从第二行开始在excel中打开时,第一列的其余部分都有一个空值。
IE:
value 1, value 2, value 3
, value 1, value 2, value 3
, value 1, value 2, value 3
, value 1, value 2, value 3
我可以在第一个值之前添加换行符或返回,但是有一个空行和列。我该如何排队?
我的代码:
try
{
connection = new iDB2Connection(connectionString);
connection.Open();
command = new iDB2Command(commandString, connection);
reader = command.ExecuteReader();
var dt = new DataTable();
dt.Load(reader);
List<string> CsvList = new List<string>();
foreach (DataRow row in dt.Rows)
{
foreach (var item in row.ItemArray)
{
CsvList.Add(item.ToString());
}
if (i == 1)
{
CsvList.Add(" ");
CsvList.Add("Customer Service");
CsvList.Add("Customer Service Representative" + "\r");
// \r and \n not working
}
}
System.IO.StreamWriter streamWriter;
streamWriter = new System.IO.StreamWriter(fileName, true);
string CsvString = string.Join(",", CsvList.ToArray());
streamWriter.WriteLine(CsvString);
streamWriter.Close();
Console.WriteLine("File saved as " + fileName);
i++;
}
答案 0 :(得分:3)
如果你只是建立一个行的列表,而不是单个值的扁平列表,那将会更容易。由于您在使用Join
时已经将列表展平,因此您可以在换行值之后添加逗号。
而是将每一行的值连接起来,然后跟踪整行:
foreach (DataRow row in dt.Rows)
{
CsvList.Add(string.Join(",", row.ItemArray));
}
现在您已经有了一个行列表,我们可以使用File.AppendAllLines
简单而轻松地将所有行写出到文件的末尾:
File.AppendAllLines(fileName, CsvList);
或者,如果您想将结果流式传输到文件而不是将所有数据复制到列表中并立即将其全部保存在内存中,则可以执行以下操作:
var lines = dt.AsEnumerable()
.Select(row => string.Join(",", row.ItemArray));
File.AppendAllLines(fileName, lines);
答案 1 :(得分:1)
不是创建数组并自己处理添加新行,而是使用StringBuilder
,并一次提交一行:
var sb = new StringBuilder();
foreach (DataRow row in dt.Rows)
{
List<string> csvList = new List<string>();
foreach (var item in row.ItemArray)
{
csvList.Add(item.ToString());
}
if (i == 1)
{
csvList.Add(" ");
csvList.Add("Customer Service");
csvList.Add("Customer Service Representative");
}
sb.WriteLine(string.Join(",", csvList));
}
System.IO.StreamWriter streamWriter;
streamWriter = new System.IO.StreamWriter(fileName, true);
streamWriter.WriteLine(sb.ToString());
streamWriter.Close();
Console.WriteLine("File saved as " + fileName);