2016-05-25 164 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