2012-05-30 38 views
13

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

+0

Podría traducir fácilmente ese código JS a C#, también podría dejarlo en las palabras clave 'var'. – tlehman

+0

Sí, eso es lo que había planeado hacer, pero el único artículo que pude encontrar, este en msdn http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/b6e8a28c-6760-4e86 -a1aa-e2ce9ec36380/usa Office.Interop y soy un novato en C# y no estoy realmente familiarizado con él. ¿Debo usarlo o debería ser bueno intentar traducir la utilidad js? ¡Gracias! – user1427026

+3

Evitaría usar Office.Interop en un archivo CSV, sería excesivo ya que CSV es solo texto. – tlehman

Respuesta

1

Desde ese same SO answer, hay un enlace a this post.

método CsvToJson extensión

/// <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 el que algunos métodos llamados dentro de la extensión anterior en vivo (ver los comentarios de la entrada original del blog), pero debe conseguir que la mayor parte de el camino hacia allí

EDIT Aquí está another SO answer sobre la división de una línea CSV. Se podría utilizar una de las soluciones sugeridas expresiones regulares 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 he probado lo anterior, por lo que me perdone si he cometido algún error.

Además, parece que Zip is a LINQ extension method, por lo que se encarga de ese problema.

+0

sí, pero SplitQuotedLine: este es un método definido por el usuario que falta en la publicación del blog – user1427026

+0

Incluso sin ver lo que sucede dentro de ese método, es bastante fácil decir que está simplemente dividiendo una cadena. 'lines.First().Dividir (',') 'básicamente haría lo mismo: probablemente solo pruebe las comas que se hayan citado y posiblemente también quite las comillas. La extensión 'Zip' puede ser un poco más para averiguar. Como dije, te lleva la mayor parte del camino hasta allí. Supongo que estás buscando algo 100% completo, ya que eres nuevo en C#, ¿verdad? –

+0

Claro, espero que funcione. Como dije, acabo de publicar un ejemplo, no lo probé. Debería funcionar, pero puede requerir algunos pequeños ajustes, ¡pero no garantías! :) –

11

Si puede utilizar 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); 

Es posible que tenga requisitos de análisis más complejos para el archivo CSV y puede que tenga una clase que encapsula los datos de una línea, pero el 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.

+0

Principalmente esto da como resultado un error si el archivo es enorme. Ejemplo: error durante la serialización o deserialización utilizando JSON JavaScriptSerializer. La longitud de la cadena excede el valor establecido en la propiedad maxJsonLength – Kurkula

0

busqué la respuesta para esta pregunta, finalmente, he resuelto mediante el uso de 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); 
    } 

} 
+0

Eres Anak ... – Leon

0

asegúrese de añadir el siguiente en web.config antes de hacerlo PARSE grandes archivos csv.

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

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

using (var p = new ChoCSVReader("sample.csv").WithFirstLineHeader()) 
{ 
    using (var w = new ChoJSONWriter("sample.json")) 
    { 
     w.Write(p); 
    } 
} 

Pedido artículo CodeProject un poco de ayuda adicional.

Descargo de responsabilidad: soy el autor de esta biblioteca.