Converting a csv file to json using C#

后端 未结 14 1568
余生分开走
余生分开走 2020-12-04 22:10

I was wondering if someone\'s written a utility to convert a CSV file to Json using C#. From a previous question on stackoverflow, I\'m aware of this nice utility - https://

相关标签:
14条回答
  • 2020-12-04 22:29

    Taking only a dependency on Newtonsoft.Json, here's a helper method given an array of CSV lines, the first one being the header.

        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)));
            }
        }
    
    0 讨论(0)
  • 2020-12-04 22:31

    Cinchoo ETL - an open source library available to do the conversion of CSV to JSON easily with few lines of code

    For a sample CSV:

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

    Sample code,

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

    Output 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 article for some additional help.

    UPDATE: If your CSV file has duplicate column names or no names, please use the below steps to produce the JSON file

    string csv = @"Id, Name, 
    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)
        .WithField("Id", position: 1)
        .WithField("Name", position: 2)
        .WithField("City", position: 3)
        .WithFirstLineHeader(true)
        )
    {
        using (var w = new ChoJSONWriter(sb))
            w.Write(p);
    }
    
    Console.WriteLine(sb.ToString());
    

    Disclaimer: I'm the author of this library.

    0 讨论(0)
  • 2020-12-04 22:33

    I used Dictionary and returned json using 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); 
    }
    
    0 讨论(0)
  • 2020-12-04 22:35

    I use ChoETL:

    using ChoETL;
    using System.IO;
    
    public class FromCSVtoJSON
    {
        public FromCSVtoJSON()
        {
    
        }
    
        public void convertFile(string inputFile, string outputFile)
        {
            using (var writer = new ChoJSONWriter(outputFile))
            {
                using (var reader = new ChoCSVReader(inputFile).WithFirstLineHeader())
                {
                    writer.Write(reader);
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-04 22:35

    Make sure you add the below in web.config before you do parse large csv files.

     <system.web.extensions>
           <scripting>
               <webServices>
                   <jsonSerialization maxJsonLength="50000000"/>
               </webServices>
           </scripting>
       </system.web.extensions>
    
    0 讨论(0)
  • 2020-12-04 22:45

    Try this and convert CSV to JSON object:

    public static List<object> CsvToJson( string body, string[] column ) {
        if ( string.IsNullOrEmpty( body ) ) return null;
        string[] rowSeparators = new string[] { "\r\n" };
        string[] rows = body.Split( rowSeparators, StringSplitOptions.None );
        body = null;
        if ( rows == null || ( rows != null && rows.Length == 0 ) ) return null;
        string[] cellSeparator = new string[] { "," };
        List<object> data = new List<object>( );
        int clen = column.Length;
        rows.Select( row => {
            if ( string.IsNullOrEmpty( row ) ) return row;
            string[] cells = row.Trim( ).Split( cellSeparator, StringSplitOptions.None );
            if ( cells == null ) return row;
            if ( cells.Length < clen ) return row;
            Dictionary<object, object> jrows = new Dictionary<object, object>( );
            for ( int i = 0; i < clen; i++ ) {
                jrows.Add( column[i], cells[i]?.Trim( ) );
            }
            data.Add( jrows );
            return row;
        } ).ToList( );
        rowSeparators = null; rows = null;
        cellSeparator = null;
        return data;
    }
    
    var data = CsvToJson("csv_input_str", new string[]{ "column_map" })
    string jsonStr = new JavaScriptSerializer { MaxJsonLength = int.MaxValue }.Serialize( data );
    
    0 讨论(0)
提交回复
热议问题