使用C#将csv文件转换为json

我想知道是否有人编写了一个实用程序,使用C#将CSV文件转换为Json。 从上一个关于stackoverflow的问题,我知道这个很好的实用程序 – https://github.com/cparker15/csv-to-json ,目前我打算引用它,但现有的C#实现将非常有帮助! 谢谢!

如果你可以使用System.Web.Extensions ,这样的东西可以工作:

 var csv = new List(); // or, List var lines = System.IO.File.ReadAllLines(@"C:\file.txt"); foreach (string line in lines) csv.Add(line.Split(',')); // or, populate YourClass string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(csv); 

您可能对csv文件有更复杂的解析要求,并且您可能有一个类来封装来自一行的数据,但关键是您可以在拥有一行代码后使用一行代码序列化为JSON。

Cinchoo ETL – 一个开源库,可以通过几行代码轻松地将CSV转换为JSON

对于示例CSV:

 Id, Name, City 1, Tom, NY 2, Mark, NJ 3, Lou, FL 4, Smith, PA 5, Raj, DC 

示例代码,

 string csv = @"Id, Name, City 1, Tom, NY 2, Mark, NJ 3, Lou, FL 4, Smith, PA 5, Raj, DC "; StringBuilder sb = new StringBuilder(); using (var p = ChoCSVReader.LoadText(csv) .WithFirstLineHeader() ) { using (var w = new ChoJSONWriter(sb)) w.Write(p); } Console.WriteLine(sb.ToString()); 

输出JSON:

 [ { "Id": "1", "Name": "Tom", "City": "NY" }, { "Id": "2", "Name": "Mark", "City": "NJ" }, { "Id": "3", "Name": "Lou", "City": "FL" }, { "Id": "4", "Name": "Smith", "City": "PA" }, { "Id": "5", "Name": "Raj", "City": "DC" } ] 

Checkout CodeProject文章提供了一些额外的帮助。

免责声明:我是这个图书馆的作者。

我使用了Dictionary并使用newtonsoft返回了json

 public string ConvertCsvFileToJsonObject(string path) { var csv = new List(); var lines = File.ReadAllLines(path); foreach (string line in lines) csv.Add(line.Split(',')); var properties = lines[0].Split(','); var listObjResult = new List>(); for (int i = 1; i < lines.Length; i++) { var objResult = new Dictionary(); for (int j = 0; j < properties.Length; j++) objResult.Add(properties[j], csv[i][j]); listObjResult.Add(objResult); } return JsonConvert.SerializeObject(listObjResult); } 
 Install Nuget package NewtonSoft.Json using System.Linq; using Newtonsoft.Json; using Microsoft.VisualBasic.FileIO; using System.IO; using System; using System.Collections.Generic; using System.Globalization; namespace Project { public static class Program { public static void main(string[] args) { string CSVpath = @"D:\New Folder\information.csv"; string analyticsData = ReadFile(CSVpath); } private static string ReadFile(string filePath) { string payload = ""; try { if (!string.IsNullOrWhiteSpace(filePath) && File.Exists(filePath) && Path.GetExtension(filePath).Equals(".csv", StringComparison.InvariantCultureIgnoreCase)) { string[] lines = File.ReadAllLines(filePath); if (lines != null && lines.Length > 1) { var headers = GetHeaders(lines.First()); payload = GetPayload(headers, lines.Skip(1)); } } } catch (Exception exp) { } return payload; } private static IEnumerable GetHeaders(string data) { IEnumerable headers = null; if (!string.IsNullOrWhiteSpace(data) && data.Contains(',')) { headers = GetFields(data).Select(x => x.Replace(" ", ""); } return headers; } private static string GetPayload(IEnumerable headers, IEnumerable fields) { string jsonObject = ""; try { var dictionaryList = fields.Select(x => GetField(headers, x)); jsonObject = JsonConvert.SerializeObject(dictionaryList); } catch (Exception ex) { } return jsonObject; } private static Dictionary GetField(IEnumerable headers, string fields) { Dictionary dictionary = null; if (!string.IsNullOrWhiteSpace(fields)) { var columns = GetFields(fields); if (columns != null && headers != null && columns.Count() == headers.Count()) { dictionary = headers.Zip(columns, (x, y) => new { x, y }).ToDictionary(item => item.x, item => item.y); } } return dictionary; } public static IEnumerable GetFields(string line) { IEnumerable fields = null; using (TextReader reader = new StringReader(line)) { using (TextFieldParser parser = new TextFieldParser(reader)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); fields = parser.ReadFields(); } } return fields; } } } 

从同一个SO答案中 ,有一个链接到这篇文章 。

CsvToJson扩展方法

 ///  /// Converts a CSV string to a Json array format. ///  /// First line in CSV must be a header with field name columns. ///  ///  public static string CsvToJson(this string value) { // Get lines. if (value == null) return null; string[] lines = value.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); if (lines.Length < 2) throw new InvalidDataException("Must have header line."); // Get headers. string[] headers = lines.First().SplitQuotedLine(new char[] { ',' }, false); // Build JSON array. StringBuilder sb = new StringBuilder(); sb.AppendLine("["); for (int i = 1; i < lines.Length; i++) { string[] fields = lines[i].SplitQuotedLine(new char[] { ',', ' ' }, true, '"', false); if (fields.Length != headers.Length) throw new InvalidDataException("Field count must match header count."); var jsonElements = headers.Zip(fields, (header, field) => string.Format("{0}: {1}", header, field)).ToArray(); string jsonObject = "{" + string.Format("{0}", string.Join(",", jsonElements)) + "}"; if (i < lines.Length - 1) jsonObject += ","; sb.AppendLine(jsonObject); } sb.AppendLine("]"); return sb.ToString(); } 

在上述扩展中调用某些方法的位置似乎存在问题(请参阅原始博客文章的评论),但它应该可以帮助您完成大部分工作。

编辑这是另一个关于拆分CSV行的答案 。 您可以使用建议的正则表达式解决方案之一来创建自己的SplitQuotedLine方法:

 public static string SplitQuotedLine(this string value, char separator, bool quotes) { // Use the "quotes" bool if you need to keep/strip the quotes or something... var s = new StringBuilder(); var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)"); foreach (Match m in regex.Matches(value)) { s.Append(m.Value); } return s.ToString(); } 

我没有测试上面的内容,所以如果我犯了任何错误,请原谅我。

此外,看起来Zip是LINQ扩展方法 ,因此可以解决这个问题。

我用ChoETL :

 using ChoETL; using System.IO; public class FromCSVtoJSON { public FromCSVtoJSON() { } public void convertFile(string inputFile, string outputFile) { using (var writer = new StreamWriter(outputFile)) { int row = 0; writer.Write("[\r\n"); foreach (var e in new ChoCSVReader(inputFile).WithHeaderLineAt()) { writer.Write((row > 0 ? ",\r\n" : "") + e.DumpAsJson()); writer.Flush(); row++; } writer.Write("]"); writer.Flush(); writer.Close(); } } } 

我找到了这个问题的答案,最后我用Dictionary解决了这个问题

 public static void CreateJsonFromCSV() { string path = "C:\\Users\\xx\\xx\\xx\\xx\\lang.csv"; string textFilePath = path; const Int32 BufferSize = 128; using (var fileStream = File.OpenRead(textFilePath)) using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) { String line; Dictionary jsonRow = new Dictionary(); while ((line = streamReader.ReadLine()) != null) { string[] parts = line.Split(','); string key_ = parts[0]; string value = parts[1]; if (!jsonRow.Keys.Contains(key_)) { jsonRow.Add(key_, value ); } } var json = new JavaScriptSerializer().Serialize(jsonRow); string path_ = "C:\\XX\\XX\\XX\\XX\\XX.csv"; File.WriteAllText(path_, json); } } 

在解析大型csv文件之前,请确保在web.config中添加以下内容。

         

依赖于Newtonsoft.Json,这是一个给定CSV行数组的辅助方法,第一个是标题。

  public static IEnumerable CsvToJson(IEnumerable csvLines) { var csvLinesList = csvLines.ToList(); var header = csvLinesList[0].Split(','); for (int i = 1; i < csvLinesList.Count; i++) { var thisLineSplit = csvLinesList[i].Split(','); var pairedWithHeader = header.Zip(thisLineSplit, (h, v) => new KeyValuePair(h, v)); yield return new JObject(pairedWithHeader.Select(j => new JProperty(j.Key, j.Value))); } }