目前我在这些行中都有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 :(得分:1)
作为一种解决方法,你可以分开","并在必要时修剪剩余的双引号。这应该使FRED,JONES成为分裂中的单一实体。如果需要,则必须重新添加引号。
答案 1 :(得分: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。