Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当CSV包含包含逗号的带引号字符串时,如何将CSV解析为JSON_C#_Json_Parsing_Csv - Fatal编程技术网

C# 当CSV包含包含逗号的带引号字符串时,如何将CSV解析为JSON

C# 当CSV包含包含逗号的带引号字符串时,如何将CSV解析为JSON,c#,json,parsing,csv,C#,Json,Parsing,Csv,目前我有以下几方面的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();

目前我有以下几方面的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\""
}]
您可以看到
名称
被拆分,逗号后的第二部分被放入下一个字段

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

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

作为解决办法,您可以在“,”上拆分,并在必要时修剪剩余的双引号。这将使弗雷德、琼斯成为一个单独的实体。但是,如果需要,您必须重新添加引号。

您可以按
“,”
进行拆分,并按
修剪输入字符串

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

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


您正在用逗号分隔字段,但您不应该用双引号分隔字段吗?您可以与自定义映射一起使用。这不是最简单的解决方案,但它有一些优点。但在Sally、Smith(所有字段都属于同一字段)成功完成此操作的情况下,此方法确实有效:)非常感谢您的帮助
    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();
    }
    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);