2012-05-30 17 views
13

Mi chiedevo se qualcuno ha scritto un'utilità per convertire un file CSV in Json usando C#. Da una precedente domanda su stackoverflow, sono a conoscenza di questa bella utility - https://github.com/cparker15/csv-to-json e al momento intendo fare riferimento ad essa ma un'implementazione C# esistente sarebbe molto utile! Grazie!Conversione di un file csv in json usando C#

+0

Si potrebbe facilmente convertire il codice JS in C#, si potrebbe lasciare anche nelle parole chiave 'var'. – tlehman

+0

Sì, questo è quello che avevo pianificato di fare ma l'unico articolo che ho trovato, questo su msdn http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/b6e8a28c-6760-4e86 -a1aa-e2ce9ec36380/utilizza Office.Interop e io sono un principiante di C# e non mi è molto familiare. Devo usarlo o dovrebbe essere un buon tentativo di tradurre l'utilità js? Grazie! – user1427026

+3

Eviterei di usare Office.Interop su un file CSV, sarebbe eccessivo visto che CSV è solo testo. – tlehman

risposta

1

Da quello same SO answer, c'è un collegamento a this post.

metodo CsvToJson estensione

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

Sembra che ci sia un problema con cui alcuni metodi chiamati entro l'estensione di cui sopra dal vivo (vedi i commenti del post originale), ma dovrebbe ottenere la maggior parte dei il modo lì.

EDIT Ecco another SO answer sulla divisione di una linea CSV. Si potrebbe utilizzare una delle soluzioni suggerite regex per creare il proprio metodo di 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(); 
} 

non ho la prova di cui sopra, quindi perdonatemi se ho fatto errori.

Inoltre, sembrerebbe che Zip is a LINQ extension method, in modo che si prende cura di questo problema.

+0

sì, ma SplitQuotedLine - questo è un metodo definito dall'utente che manca dal post del blog – user1427026

+0

Anche senza vedere cosa sta succedendo all'interno di quel metodo, è abbastanza facile dire che è sufficiente dividere una stringa. 'Lines.First().Split (',') 'essenzialmente farebbe la stessa cosa - probabilmente verterà solo per le virgolette quotate e possibilmente toglierà anche le virgolette. L'estensione 'Zip' potrebbe essere un po 'più da capire. Come ho detto, ti prende quasi tutto il tempo. Immagino che tu stia cercando qualcosa di completo al 100% sebbene tu sia nuovo in C#, giusto? –

+0

Certo, spero che funzioni. Come ho detto, ho appena pubblicato un esempio, non l'ho provato. Dovrebbe funzionare, ma potrebbe richiedere alcune piccole modifiche, ma nessuna garanzia! :) –

11

Se è possibile utilizzare System.Web.Extensions, qualcosa di simile potrebbe funzionare:

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

si potrebbe avere i requisiti di analisi più complesse per il file CSV e si potrebbe avere una classe che incapsula i dati da una linea, ma il Il punto è che puoi serializzare su JSON con una riga di codice una volta che hai una collezione di linee.

+0

Principalmente questo risultato in errore se il file è enorme. Es: errore durante la serializzazione o deserializzazione mediante JavaScript JSerializer. La lunghezza della stringa supera il valore impostato sulla proprietà maxJsonLength – Kurkula

0

ho cercato la risposta per questa domanda, infine, ho risolto utilizzando Dizionario

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

tu sei Anak ... – Leon

0

Assicurati di aggiungere il seguito nel web.config prima di fare il parsing di grandi file csv.

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

Cinchoo ETL - una libreria open source disponibili per eseguire la conversione di CSV per JSON facilmente con poche righe di codice

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

Checkout articolo CodeProject per un aiuto supplementare.

Disclaimer: io sono l'autore di questa biblioteca.