【问题标题】:How to parse CSV into JSON when CSV contains quoted strings containing commas [duplicate]当CSV包含包含逗号的引号字符串时如何将CSV解析为JSON
【发布时间】:2016-05-25 14:52:08
【问题描述】:

目前我有这些方面的 CSV:

"NAME","AGE","SEX"
"FRED, JONES","45","MALE"
"SALLY, SMITH","60","FEMALE"

我使用以下代码将其序列化为 JSON:

var linesCSV = System.IO.File.ReadAllLines(targetFile); //target file is the csv

var csv = linesCSV.Select(l => l.Split(',')).ToList();

var headers = csv[0];
var dicts = csv.Skip(1).Select(row => Enumerable.Zip(headers, row, System.Tuple.Create).ToDictionary(p => p.Item1, p => p.Item2)).ToArray();

string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(dicts);

jsWrtr.WriteLine(json);

这样输出:

[{
  "\NAME\"" : "\"FRED\"",
  "\AGE\"" : "\"JONES\"",
  "\SEX\"" : "\"45\""
},
{
  "\NAME\"" : "\"SALLY\"",
  "\AGE\"" : "\"SMITH\"",
  "\SEX\"" : "\"60\""
}]

您可以看到NAME 被拆分,第二部分(逗号后的部分)被放入下一个字段。

这显然是因为中间有逗号,但我的问题是如何解析 CSV 以便输出以下内容:

[{
   "NAME" : "FRED, JONES",
   "AGE" : "45",
   "SEX" : "MALE"
 },
 {
   "NAME" : "SALLY, SMITH",
   "AGE" : "60",
   "SEX" : "FEMALE"
 }]

【问题讨论】:

  • 你用逗号分隔字段,但你不应该用双引号吗?
  • 您可以将CsvHelper library 与自定义地图一起使用。不是最简单的解决方案,但它有一些优势。

标签: c# json parsing csv


【解决方案1】:

您可以改为使用"," 拆分,并通过" 修剪输入字符串。

    List<string> lines = new List<string>
{
    "\"NAME\", \"AGE\", \"SEX\"",
    "\"FRED, JONES\", \"45\", \"MALE\"",
    "\"SALLY, SMITH\", \"60\", \"FEMALE\""
};

    foreach (var line in lines.Skip(1))
    {
        var fields = line.Trim(new char[] { '"' }).Split(new string[] { "\", \"" }, StringSplitOptions.None);

        foreach (var field in fields)
            Console.WriteLine(field.Trim());

        Console.WriteLine();
    }

这将正确提取字段,您可以继续进行 json 序列化。

更新

这是 json 序列化的更新,为您提供所需的输出:

    foreach (var line in lines.Skip(1))
    {
        var fields = line.Trim(new char[] { '"' }).Split(new string[] { "\", \"" }, StringSplitOptions.None);

        Entry entry = new Entry { Name = fields.FirstOrDefault(), Age = fields.Skip(1).FirstOrDefault(), Sex = fields.LastOrDefault() };
        results.Add(entry);
    }

    var json = JsonConvert.SerializeObject(results);

请注意,为简单起见,我创建了一个名为 Entry 的类,其中包含 3 个字符串,每个字段一个,但您可能希望使用不同的类型(然后需要正确解析值)。

请注意,我使用 Newtonsoft 的 Json nuget 库进行序列化 - 您似乎在使用其他东西。除非您需要坚持使用您的库,否则我推荐广泛使用的 Newtonsoft。

【讨论】:

  • 设法完成它:)非常感谢您的帮助
【解决方案2】:

作为一种解决方法,您可以拆分“,”并在必要时修剪剩余的双引号。这应该将 FRED、JONES 作为拆分中的单个实体。但是,如果需要,您必须重新添加引号。

【讨论】:

  • 但这在 Sally、Smith 等情况下确实有效(同一领域的所有部分)
猜你喜欢
  • 2016-04-15
  • 2018-03-20
  • 2020-06-09
  • 2018-04-01
  • 2013-05-31
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多