net csvwriter convert c# json csv

csvwriter - Convertir un archivo csv a json usando C#



convert json to csv vb net (9)

Me preguntaba si alguien ha escrito una utilidad para convertir un archivo CSV a Json usando C #. De una pregunta anterior sobre stackoverflow, soy consciente de esta agradable utilidad: https://github.com/cparker15/csv-to-json y en este momento planeo referirme a ella, pero una implementación de C # existente sería muy útil ! ¡Gracias!


Asegúrese de agregar lo siguiente en web.config antes de analizar archivos csv grandes.

<system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="50000000"/> </webServices> </scripting> </system.web.extensions>


Busqué la respuesta a esta pregunta, finalmente la resolví utilizando el Diccionario.

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<string, string> jsonRow = new Dictionary<string, string>(); 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); } }


De esa misma respuesta de SO , hay un enlace a esta publicación .

Método de extensión CsvToJson

/// <summary> /// Converts a CSV string to a Json array format. /// </summary> /// <remarks>First line in CSV must be a header with field name columns.</remarks> /// <param name="value"></param> /// <returns></returns> 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(); }

Parece que hay un problema con la ubicación de algunos de los métodos llamados dentro de la extensión anterior (consulte los comentarios de la publicación original del blog), pero debería llegar hasta allí.

EDITAR Aquí hay otra respuesta SO sobre la división de una línea CSV. Podría usar una de las soluciones de SplitQuotedLine regulares sugeridas para crear su propio método 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(); }

No probé lo anterior, así que perdóname si cometí algún error.

Además, parece que Zip es un método de extensión LINQ , por lo que se encarga de ese problema.


Si puedes usar System.Web.Extensions , algo como esto podría funcionar:

var csv = new List<string[]>(); // or, List<YourClass> 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);

Podría tener requisitos de análisis más complejos para el archivo csv y podría tener una clase que encapsule los datos de una línea, pero el punto es que puede serializar a JSON con una línea de código una vez que tenga una Colección de líneas.


Tomando solo una dependencia de Newtonsoft.Json, aquí hay un método auxiliar dado un conjunto de líneas CSV, siendo la primera el encabezado.

public static IEnumerable<JObject> CsvToJson(IEnumerable<string> 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<string, string>(h, v)); yield return new JObject(pairedWithHeader.Select(j => new JProperty(j.Key, j.Value))); } }


Usé el diccionario y devolví json usando newtonsoft

public string ConvertCsvFileToJsonObject(string path) { var csv = new List<string[]>(); var lines = File.ReadAllLines(path); foreach (string line in lines) csv.Add(line.Split('','')); var properties = lines[0].Split('',''); var listObjResult = new List<Dictionary<string, string>>(); for (int i = 1; i < lines.Length; i++) { var objResult = new Dictionary<string, string>(); for (int j = 0; j < properties.Length; j++) objResult.Add(properties[j], csv[i][j]); listObjResult.Add(objResult); } return JsonConvert.SerializeObject(listObjResult); }


Yo uso 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(); } } }


Cinchoo ETL : una biblioteca de código abierto disponible para realizar la conversión de CSV a JSON fácilmente con pocas líneas de código

Para una muestra de CSV:

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

Código de muestra,

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

Salida 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" } ]

Consulte el artículo de CodeProject para obtener ayuda adicional.

Descargo de responsabilidad: Soy el autor de esta biblioteca.


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<string> GetHeaders(string data) { IEnumerable<string> headers = null; if (!string.IsNullOrWhiteSpace(data) && data.Contains('','')) { headers = GetFields(data).Select(x => x.Replace(" ", ""); } return headers; } private static string GetPayload(IEnumerable<string> headers, IEnumerable<string> fields) { string jsonObject = ""; try { var dictionaryList = fields.Select(x => GetField(headers, x)); jsonObject = JsonConvert.SerializeObject(dictionaryList); } catch (Exception ex) { } return jsonObject; } private static Dictionary<string, string> GetField(IEnumerable<string> headers, string fields) { Dictionary<string, string> 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<string> GetFields(string line) { IEnumerable<string> 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; } } }