【问题标题】:Exporting mutiline data into same cell in csv将多行数据导出到csv中的同一单元格
【发布时间】:2019-07-04 00:19:21
【问题描述】:

我知道这个问题已经被问过很多次了(123),但我只是不明白如何在我的情况下应用它。我已经尝试玩了几个小时,但我无法做到正确。

我有List<string>形式的变量,其中每个列表都包含在它们之间有换行符的数据/多行数据。然后我调用了一个事件,将这些数据导出到 CSV 文件中。下面是我的代码。

savestate.cs - 我初始化变量的类

public partial class Savestate
 { 
    public static List<string> rtb1_list = new List<string>();
    public static List<string> rtb2_list = new List<string>();
    public static List<string> rtb3_list = new List<string>();
    public static List<string> rtb4_list = new List<string>();
 }

Form1.cs - 事件

public void Savetocsv()
    {
      Type s = typeof(Savestate);
      FieldInfo[] fields = s.GetFields(BindingFlags.Public | BindingFlags.Static);

      StringBuilder csvdata = new StringBuilder();
      string header = String.Join(",", fields.Select(f => f.Name).ToArray());
      csvdata.AppendLine(header);

      string rtb1 = String.Join(",", Savestate.rtb1_list.ToArray());
      string rtb2 = String.Join(",", Savestate.rtb2_list.ToArray());
      string rtb3 = String.Join(",", Savestate.rtb3_list.ToArray());
      string rtb4 = String.Join(",", Savestate.rtb4_list.ToArray());

      string newlinestring = string.Format("{0}; {1}; {2}; {3}", rtb1, rtb2, rtb3, rtb4);
      csvdata.AppendLine(newlinestring);

      string filepath = @"C:\new.csv";
      File.WriteAllText(filepath, csvdata.ToString());
    }

但是,当我打开 CSV 文件时,这些文字到处都是。例如,我写了 hi 然后换行,然后我写了 bye。这是actual output,这是我的intended output。希望我能得到帮助。

【问题讨论】:

    标签: c# winforms export-to-csv multiline


    【解决方案1】:

    要在csv 文件中插入换行符,您需要用双引号将字符串括起来,因此通过以下代码生成所需的输出:

    public partial class Savestate
    {
        public static List<string> rtb1_list = new List<string>() { "hi1", "bye1" };
        public static List<string> rtb2_list = new List<string>() { "hi2", "bye2" };
        public static List<string> rtb3_list = new List<string>() { "hi3", "bye3" };
        public static List<string> rtb4_list = new List<string>() { "hi4", "bye4" };
    }
    public static void Savetocsv()
    {
        Type s = typeof(Savestate);
        FieldInfo[] fields = s.GetFields(BindingFlags.Public | BindingFlags.Static);
    
        StringBuilder csvdata = new StringBuilder();
        string header = String.Join(",", fields.Select(f => f.Name).ToArray());
        csvdata.AppendLine(header);
    
        string rtb1 =  String.Join("\n", Savestate.rtb1_list.ToArray());
        string rtb2 =  String.Join("\n", Savestate.rtb2_list.ToArray());
        string rtb3 =  String.Join("\n", Savestate.rtb3_list.ToArray());
        string rtb4 =  String.Join("\n", Savestate.rtb4_list.ToArray());
    
        string newlinestring = string.Format("\"{0}\",\" {1}\",\" {2}\",\" {3}\"", @rtb1, @rtb2, @rtb3, @rtb4);
        csvdata.AppendLine(newlinestring);
    
        string filepath = @"new.csv";
        File.WriteAllText(filepath, csvdata.ToString());
    }
    

    输出文件:

    【讨论】:

    • 海@Mehrdad。除了{ "hi1", "bye1" }; 的位之外,我遵循了您的所有代码,因为当我运行winforms 时,写入的数据不是你好,再见,但可能是阳光下的任何东西。因此,即使我删除了那个位,代码仍然可以完美运行。谢谢!
    【解决方案2】:

    我建议在处理 CSV 时使用CsvHelper Nuget Package,然后尝试执行以下操作,我添加了一个扩展方法,将每个 rtb 列表打印为一个字符串:

    public partial class Savestate
    {
        public static List<string> rtb1_list = new List<string>() { "hi", "bye" };
        public static List<string> rtb2_list = new List<string>() { "hi", "bye" };
        public static List<string> rtb3_list = new List<string>() { "hi", "bye" };
        public static List<string> rtb4_list = new List<string>() { "hi", "bye" };
    }
    
    public static class SavestateExtensions
    {
        public static string GetRtbListAsString(this IEnumerable<string> rtb_list)
        {
            StringBuilder str = new StringBuilder();
    
            foreach (var value in rtb_list)
            {
                str.AppendLine(value);
            }
    
            return str.ToString();
        }
    }
    

    然后使用CSVHelper中的CsvWriter

            using (var writer = new StreamWriter("file.csv"))
            {
                using (var csvWriter = new CsvWriter(writer))
                {
                    csvWriter.Configuration.Delimiter = ";";
                    csvWriter.Configuration.Encoding = Encoding.UTF8;
    
                    csvWriter.WriteField("rtb1_list ");
                    csvWriter.WriteField("rtb2_list ");
                    csvWriter.WriteField("rtb3_list ");
                    csvWriter.WriteField("rtb4_list ");
                    csvWriter.NextRecord();
    
                    csvWriter.WriteField(Savestate.rtb1_list.GetRtbListAsString());
                    csvWriter.WriteField(Savestate.rtb2_list.GetRtbListAsString());
                    csvWriter.WriteField(Savestate.rtb3_list.GetRtbListAsString());
                    csvWriter.WriteField(Savestate.rtb4_list.GetRtbListAsString());
                    csvWriter.NextRecord();
                }
            }
    

    输出应该如下:

    【讨论】:

    • 海@阿里。注意 CSV 助手。您的逻辑也有效,但我将代码与现有代码类似,因为我对此更熟悉。感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2020-09-28
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多