【问题标题】:csvHelper string[][] to string[]csvHelper string[][] to string[]
【发布时间】:2019-03-28 13:04:05
【问题描述】:

我在 csv 中有一些数据,例如

string[][] items = new string[][] {
  new string[] { "dog", "3" },
  new string[] { "cat", "2" },
  new string[] { "bird", "1" }
};

现在我想将输入转换为格式正确的 CSV 行并返回它们 - 预期输出:

string[] csvLines = {"\"dog\";\"3\"", "\"cat\";\"2\"", "\"bird\";\"1\""};

或文件:

"dog";"3"
"cat";"2"
"bird";"1"

我尝试过的:

public static IEnumerable<string> GetCSVLines(string[][] list)
{
    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    using (CsvHelper.CsvWriter csv = new CsvHelper.CsvWriter(writer))
    {
        foreach (var item in list)
        {
            foreach (var field in item)
            {
                csv.WriteField(field);
            }
            yield return csv.Record; //??
            csv.NextRecord();                  
        }                 
    }
}

注意:我不能只使用string.Join(),因为这些字段可能包含"、分隔符; 或换行符。

【问题讨论】:

  • 这与 CsvHelper 有什么关系?一个简单的SelectString.Format 将产生输出
  • 您希望输出包含转义的双引号?
  • 你的 items 数组清晰吗?
  • 为什么不直接写list.Select(pair=&gt;String.Format("\"{0}\";\"{1}\"",pair[0],pair[1])).ToArray()
  • @Toshi 你必须解释你想要做什么,否则这个问题将因为不清楚而被关闭。我怀疑您想将输入转换为格式正确的 CSV 行并返回它们。但这不是问题所要问的,“期望的输出”与 CSV 行无关

标签: c# string csv csvhelper


【解决方案1】:

如果你想用引号括起来(带擒纵机构:"ab\"c" 应该是"\"ab\"\"c\"")和Join 他们用; 你不需要CsvHelper 而是一个简单的Linq em>

  string[][] items = new string[][] {
    new string[] { "dog", "3" },
    new string[] { "cat", "2" },
    new string[] { "bird", "1" },
    new string[] { "e\"sc", "4" } // escapment demo
  };

  string[] result = items
    .Select(line => string.Join(";", 
       line.Select(item => "\"" + item.Replace("\"", "\"\"") + "\"")))
    .ToArray();

  Console.Write(string.Join(Environment.NewLine, result));

结果:

"dog";"3"
"cat";"2"
"bird";"1"
"e""sc";"4"

【讨论】:

    【解决方案2】:

    我会说@Dmitry Bychenko 的回答更直接,但如果你确实想使用 CsvHelper 是可能的。

    public static IEnumerable<string> GetCSVLines(string[][] list)
    {
        using (MemoryStream stream = new MemoryStream())
        using (StreamWriter writer = new StreamWriter(stream))
        using (CsvHelper.CsvWriter csv = new CsvHelper.CsvWriter(writer))
        using (StreamReader reader = new StreamReader(stream))
        {
            csv.Configuration.ShouldQuote = (field, context) => true;
            csv.Configuration.Delimiter = ";";
    
            foreach (var items in list)
            {
                foreach (var item in items)
                {
                    csv.WriteField(item);
                }                    
                csv.NextRecord();
    
                writer.Flush();
                stream.Position = 0;
    
                yield return reader.ReadToEnd().TrimEnd('\n');
    
                stream.Position = 0;
            }   
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2022-12-16
      • 2022-12-27
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多