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#
Respuesta
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.
sí, pero SplitQuotedLine: este es un método definido por el usuario que falta en la publicación del blog – user1427026
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? –
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! :) –
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.
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
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);
}
}
Eres Anak ... – Leon
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>
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.
- 1. Python - convertir el archivo csv a JSON
- 2. Convertir archivo CSV a XML
- 3. Biblioteca PHP para convertir JSON a CSV?
- 4. Convertir el archivo xlsx a csv usando el lote
- 5. Convierta .json a .csv en ruby
- 6. Convertir formato JSON a formato CSV para MS Excel
- 7. CSV a JSON con PHP?
- 8. Convierta JSON a CSV
- 9. Convertir CSV a ARFF usando weka
- 10. Convertir archivo txt a csv en powershell
- 11. Convertir MDB a CSV
- 12. Convertir archivo XML a CSV en java
- 13. Convertir RDA a csv
- 14. Convertir archivo CHM a CSV o SQL
- 15. Convertir archivo PDF a imágenes usando C#
- 16. ¿Cómo puedo convertir un archivo xml en JSON usando Python?
- 17. ¿Convertir el archivo .csv en .dbf usando Python?
- 18. Cómo convertir CSV a Excel?
- 19. ¿Cómo convertir múltiples archivos xls a csv usando powershell?
- 20. cómo convertir XML a JSON usando jQuery
- 21. convirtiendo CSV/XLS a JSON?
- 22. Cómo leer un archivo CSV usando iOS
- 23. ¿Cómo anexar a un archivo CSV?
- 24. Convertir DataTable a CSV stream
- 25. Cómo convertir clases JSON a C#?
- 26. ¿Cómo creo un archivo CSV usando Perl?
- 27. ¿Cómo convertir un archivo separado por tabulaciones al formato CSV?
- 28. Convertir un objetivo c objeto iOS a una cadena JSON
- 29. Cómo convertir DateTime de JSON a C#?
- 30. convertir objeto JSON en formato csv en javascript
Podría traducir fácilmente ese código JS a C#, también podría dejarlo en las palabras clave 'var'. – tlehman
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
Evitaría usar Office.Interop en un archivo CSV, sería excesivo ya que CSV es solo texto. – tlehman