【问题标题】:Saving a 2D array to csv with separate cells in C#在 C# 中使用单独的单元格将 2D 数组保存到 csv
【发布时间】:2020-11-29 22:11:00
【问题描述】:

我在将 2D 数组 string[,] 保存到 C# 中的 csv 文件 时遇到问题。当我在 Excel 中打开 .csv 文件时,我希望每个元素都位于自己的单元格中,但是使用此代码,所有内容都将在一列中结束。为了让每个元素都在自己的单元格中,我应该更改什么?

public static void Main(string[] args)
{
    string[,] array = new string[2, 5];
    
    array[0, 0] = "ID";
    array[0, 1] = "Turns";
    array[0, 2] = "Forward Results";
    array[0, 3] = "Backward Results";
    array[0, 4] = "Trainings";
    
    array[1, 0] = "SEL-HYS-001";
    array[1, 1] = "5";
    array[1, 2] = "100%";
    array[1, 3] = "100%";
    array[1, 4] = "1";

    StreamWriter sw = File.CreateText("outputText.csv");
            
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            sw.Write(array[i, j] + ";");
        }
        
        sw.Write("\n");
    }

    sw.Flush();
    sw.Close();

    Console.WriteLine("Success!");
}

【问题讨论】:

  • 您使用分号分隔值,但 csv 格式使用逗号作为分隔符,这就是为什么它无法按预期工作的原因。
  • @nick 好的,我很高兴修复这么简单,非常感谢!
  • Excel 中用于加载 CSV 文件的字段分隔符取决于语言。德语 Excel 有一个分号“;”作为字段分隔符。

标签: c# arrays csv


【解决方案1】:

让我们把最初的问题一分为二;首先,将string[,] data转换成csv:

using System.IO;
using System.Linq;

...

private static IEnumerable<string> ToCsv(string[,] data, char delimiter = ';') {
  for (int r = 0; r < data.GetLength(0); ++r) {
    StringBuilder sb = new StringBuilder();

    for (int c = 0; c < data.GetLength(1); ++c) {
      string v = data[r, c] ?? "";

      // Do we have to escape? E.g. abc;d"ef -> "abc;d""ef"
      if (v.Any(c => c < ' ' || c == '"' || c == delimiter))
        v = "\"" + v.Replace("\"", "\"\"") + "\"";

      if (sb.Length > 0)
        sb.Append(delimiter);

      sb.Append(v);
    }

    yield return sb.ToString();
  }
}

然后将数据写入文件:

string[,] array = ...

File.WriteAllLines("outputText.csv", ToCsv(array));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 2013-10-24
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2021-05-28
    • 2022-01-14
    • 2020-10-17
    相关资源
    最近更新 更多