Converting a csv file to json using C#

后端 未结 14 1570
余生分开走
余生分开走 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:45

    Simple method to convert flat csv file to a collection of simple json formatted objects. Works with files with header row on the first line. Part of this method was found somewhere else on SO. Add reference to Microsoft.VisualBasic.

    using Microsoft.VisualBasic.FileIO;
    public static StringBuilder ReadCsv()
        {
            var path = @"X:\...\input.csv";
            using (TextFieldParser csvParser = new TextFieldParser(path))
            {
                csvParser.CommentTokens = new string[] { "#" };
                //Remember to use your own separator
                csvParser.SetDelimiters(new string[] { ";" });
                csvParser.HasFieldsEnclosedInQuotes = false;
    
                StringBuilder json = new StringBuilder();
                string[] colNames = new string[0];
                string[] fields = new string[0];
    
                json.Append("[");
    
                int counter = 0;
                while (!csvParser.EndOfData)
                {
                    if (counter == 0)
                    {
                        //Read properies' names
                        colNames = csvParser.ReadFields();
                        counter++;
                        Console.WriteLine($"{colNames.Length} columns detected!");
                    }
                    else
                    {
                        // Read current line fields, pointer moves to the next line.
                        // Read the properties' values
                        fields = csvParser.ReadFields();
    
                        json.Append("{");
    
                        for (int i = 0; i < colNames.Length; i++)
                        {
                            json.Append($"\"{colNames[i]}\":{TryParse(fields[i])}");
                            if (i != colNames.Length - 1)
                            {
                                json.Append(",");
                            }
                        }
                        json.Append("},");
                        Console.WriteLine($"Writing record nr.: {counter}");
                        counter++;
                    }
                }
                json.Length--; //Remove trailing comma
                json.Append("]");
                return json;
            }
        }
    
    string TryParse(string s)
        {
            if (string.IsNullOrEmpty(s)) return "null";
            //Remember to set your decimal character here!
            if (s.Contains('.'))
            {
                double dResult;
                //This works on my computer, could be different on your machine
                if (double.TryParse(s, NumberStyles.AllowDecimalPoint,
                                    CultureInfo.InvariantCulture, out dResult))
                    return dResult.ToString(CultureInfo.InvariantCulture);
            }
            else
            {
                int intResult;
                if (int.TryParse(s, out intResult))
                    return intResult.ToString(CultureInfo.InvariantCulture);
            }
            return "\"" + s + "\"";
        }
    

    This should give you a simple list of json objects.

    0 讨论(0)
  • 2020-12-04 22:46
    Install Nuget package NewtonSoft.Json
    Add reference dll Microsoft.VisualBasic
    
    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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-04 22:46

    Here's mine.. It can parse 9k CSV records in centuries. LOL

    class CSVTOJSON
    {
        public string ConvertToJSON()
        {
            string json = string.Empty;
            string csv = string.Empty;
    
            using (StreamReader reader = new StreamReader("data.csv"))
            {
                csv = reader.ReadToEnd();
            }
    
            string[] lines = csv.Split(new string[] { "\n" }, System.StringSplitOptions.None);
    
            if (lines.Length > 1)
            {
                // parse headers
                string[] headers = lines[0].Split(',');
    
                StringBuilder sbjson = new StringBuilder();
                sbjson.Clear();
                sbjson.Append("[");
    
                // parse data
                for (int i = 1; i < lines.Length; i++)
                {
                    if (string.IsNullOrWhiteSpace(lines[i])) continue;
                    if (string.IsNullOrEmpty(lines[i])) continue;
    
                    sbjson.Append("{");
    
                    string[] data = lines[i].Split(',');
    
                    for (int h = 0; h < headers.Length; h++)
                    {
                        sbjson.Append(
                            $"\"{headers[h]}\": \"{data[h]}\"" + (h < headers.Length - 1 ? "," : null)
                        );
                    }
    
                    sbjson.Append("}" + (i < lines.Length - 1 ? "," : null));
                }
    
                sbjson.Append("]");
    
                json = sbjson.ToString();
            }
    
            return json;
        }
    }
    

    But it works.

    console log:

    Converting CSV to JSON
    CSV has 9486 data
    Total duration converting CSV to JSON: 00:00:00.0775373
    
    0 讨论(0)
  • 2020-12-04 22:50

    If you can use System.Web.Extensions, something like this could work:

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

    You might have more complex parsing requirements for the csv file and you might have a class that encapsulates the data from one line, but the point is that you can serialize to JSON with one line of code once you have a Collection of lines.

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

    First, load the csv file into datatable and serialize it to Json document. It uses OLEDB Provider that can parse the csv wisely,

    Courtesy to Jim Scott, https://stackoverflow.com/a/1050278/6928056

    Courtesy to K_B, https://stackoverflow.com/a/2979938/6928056

    using System.Data;
    using System.Data.OleDb;
    using System.Globalization;
    using System.IO;
    using Newtonsoft.Json;
    
    static string ConvertCsvToJson(string path, bool isFirstRowHeader)
    {
        string header = isFirstRowHeader ? "Yes" : "No";
    
        string pathOnly = Path.GetDirectoryName(path);
        string fileName = Path.GetFileName(path);
    
        string sql = @"SELECT * FROM [" + fileName + "]";
    
        using(OleDbConnection connection = new OleDbConnection(
                  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
                  ";Extended Properties=\"Text;HDR=" + header + "\""))
        using(OleDbCommand command = new OleDbCommand(sql, connection))
        using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
        {
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.CurrentCulture;
            adapter.Fill(dataTable);
            return JsonConvert.SerializeObject(dataTable, Formatting.Indented);
        }
    }
    
    0 讨论(0)
  • 2020-12-04 22:52

    Try this:

     StreamReader sr = new StreamReader(filePath);
     while ((line = sr.ReadLine()) != null)
     {
          //Console.WriteLine(line);
          string[] csv = line.Split(',');
          var dictionary = new Dictionary<string, string>();
          dictionary.Add("dispatching_base_number",csv[0]);
          dictionary.Add("available_vehicles", csv[1]);
          dictionary.Add("vehicles_in_trips", csv[2]);
          dictionary.Add("Cancellations", csv[3]);
          string jsonN = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(dictionary);
          Console.WriteLine("Sending message: {0}",jsonN);
     }
    
    0 讨论(0)
提交回复
热议问题