2016-05-25 165 views
1

引用的字符串目前我有CSV沿着这些线路:如何解析CSV成JSON当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" 
}] 
+0

你是用逗号分割的领域,但你应该不会用双引号这样做? – Veverke

+0

您可以使用带有自定义地图的[CsvHelper库](https://joshclose.github.io/CsvHelper/)。不是最简单的解决方案,但它有一些优点。 – Fabjan

回答

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); 

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

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

enter image description here

+0

管理完成它:)非常感谢您的帮助 – thatOneGuy

1

作为一个解决办法,你可以拆的“”和装饰其余的双引号在必要的地方。这应该让FRED,JONES成为一个单独的实体。但是,如果需要的话,您必须重新添加引号。

+0

但在Sally,Smith(同一领域的所有部分)这样的情况下工作 – Veverke