【问题标题】:Best way to convert Dictionary to CSV C#将字典转换为 CSV C# 的最佳方法
【发布时间】:2014-06-28 06:31:56
【问题描述】:

我正在开发一个接收大量 Json 的 c# 应用程序,我想获取此 Json 数据(当前位于字符串变量中)并将其保存为 CSV 文件。

我做了一些研究,但我不知道如何解决这个任务?

编辑 -

从我之前的问题来看,似乎没有一种简单的方法可以做我想做的事。通过进一步研究,我发现可以从字典创建 CSV 文件。

我现在有这种类型的变量中的数据:

Dictionary<string, List<string>> dictionary; 

如何将此 ^ 导出到 csv? 字典中的数据在运行时也是未知的,所以我想用一个','分隔,但它的未知是数据在正文中包含一个','。有没有办法检查并摆脱这种情况?

【问题讨论】:

  • CSV 如何成为动态内容的良好格式?询问后,您可以将@LarsHoldgaard 答案与Json.NET library(支持动态序列化)结合起来,它会起作用(也许反射也会有所帮助)。
  • 也许解释一下为什么必须将其导出为 csv 会有所帮助? CSV 通常用于呈现表格数据,但如果每一行都不同,那么它基本上消除了 csv 的好处。也许有一种替代方法可以得到你没有想到的结果,而 csv 并不是真正的答案?

标签: c# json csv export-to-csv


【解决方案1】:

我会使用 JSON.NET 将其转换为 C# 对象。然后,我会迭代我的 C# 对象并按照你想要的顺序写入值。

这应该很简单:)

【讨论】:

  • 好的,但假设我不知道我得到的 json 的结构,并且每个 json 字符串完全不同。那么有没有一种方法可以将此 json 字符串转换为 csv 文件,或者甚至是可以更轻松地映射到 CSV 的不同类型,而无需为我得到的每个潜在 json 字符串创建一个类?
  • 将 XML 转换为 csv 文件会更容易吗? @lars
  • 啊,这让事情变得更加困难了 :) 你可以做的是使用反射,即使它可能没有多大意义。您可以迭代 JObject 中的所有标记+属性,然后写入 CSV?在这里查看一些代码:stackoverflow.com/questions/13652983/…
  • 无论如何,您将失去 JSON 文件的一些深度。所以这也取决于你打算用它来做什么......
  • 我的应用程序正在发送 json 或者可以切换到 xml。我需要将其导出为 CSV 文件吗?
【解决方案2】:

我想首先让我们看一下 CSV 文件..

什么是csv文件?实际上它是不言自明的(逗号分隔值),但只是一个 CSV 文件是一个文件,它携带/存储不同的值并用逗号分隔(类似“,”或“;”或其他)

因此,当您想创建一个 csv 文件时,您可以简单地迭代您的值并用您决定的一些字符将其分隔..

请注意,您的分隔符(您决定用来将不同值与其他值分开的字符)不应出现在您的值中。

假设你有这首诗要存储,你想用分隔符“,”与诗行分开:

When evening comes
Mails singing misses,
But Zagreb(Croatian) Radio the Lili Marleen Song
....
We, All Human-kind sweared : 
we believed on Freedom,
We, sweared for the sake of Freedom!
.....
[ Attila ILHAN ]

会发生什么?你得到了意想不到的结果,因为这首诗的正文中有你的分隔符..

使用伪:

1-) 决定您的分隔符,因为数据主体没有 2-) 将您的数据作为字符串 3-) 将分隔符附加到 csv 文件

编辑 - 在对我进行操作后,用其他评论员的有用知识更改他的问题主体..

伪:

string delimiter = "##";

string Path = yourCSVFilePathToSave;

bool append = true;

string HexadecimalFormat = "X";

Encoding enc = Encoding.UTF-8;

int bufferSize = 4096;

int[] intArray = {1,2,3,4,5,6,7,8,9};

  using ( var writer = new StreamWriter(Path, append, enc, bufferSize))
  {
     foreach ( int i in intArray)
     {
       writer.Write (HexadecimalFormat, i);
       writer.Write (HexadecimalFormat, delimiter);
     }
   }

假读:

List<string> list = new List<string>();
       using (var reader = new StreamReader(Path, enc))
       { 
           list.AddRange(reader.ReadLine().Split(new char[] { '#', '#' }, StringSplitOptions.RemoveEmptyEntries).ToList());
       }

【讨论】:

  • 我收到的数据的主体在我得到它之前是未知的,所以假设我想用','分隔它需要某种形式的验证。我也知道我的 CSV 文件是什么,那么我该如何使用您的问题来解决我的问题?
猜你喜欢
  • 2022-01-20
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多