1

我正在从数据库值构建一个 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++;
}
4

2 回答 2

4

如果您只是建立一个lines列表,而不是单个值的扁平列表,这将容易得多。例如,由于您在使用时已经将列表展平,因此您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);
于 2013-10-08T16:52:20.000 回答
1

与其创建数组并自己处理添加换行符,不如使用 aStringBuilder并一次提交每一行:

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);
于 2013-10-08T16:53:54.643 回答