سلسلة JSON لتحويل CSV و CSV إلى JSON في c#



csvhelper (3)

أنا أعمل مع ملفات JSON / CSV في مشروع API الخاص بـ asp.net على الويب ، وقد جربت مع مكتبات CSVHelper و ServiceStack.Text ، لكن لم أستطع تشغيلها.

ملف JSON الذي يحتوي على صفيف ديناميكي وقد يحتوي على أي عدد من الحقول

قرأت الملف باستخدام streamreader ثم أحتاج إلى تحويله إلى ملف CSV لجعله قابلاً للتحميل للمستخدمين النهائيين.

مثال ملف النص

[{"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"},
 {"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"}]

JSON إلى CSV

public static string jsonStringToCSV(string content)
{
    var jsonContent = (JArray)JsonConvert.DeserializeObject(content);

    var csv = ServiceStack.Text.CsvSerializer.SerializeToCsv(jsonContent);
    return csv;
}

هذا لا ينتج لي بيانات ملف CSV

ثم بعض الملفات هي نوع محدد بفاصلة أو علامة تبويب وأريد استخدام CSVHelper لتحويل سلسلة CSV إلى IEnumerable بشكل حيوي

public static IEnumerable StringToList(string data, string delimiter, bool HasHeader)
{
    using (var csv = new CsvReader(new StringReader(data)))
    {
         csv.Configuration.SkipEmptyRecords = true;
         csv.Configuration.HasHeaderRecord = HasHeader;
         csv.Configuration.Delimiter = delimiter;

         var records = csv.GetRecords();
         return records;
     }
}

https://src-bin.com


Answer #1

لا أعرف ما إذا كان هذا متأخرًا جدًا للإبلاغ عن حل لسؤالك. في حالة ما إذا كنت ترغب في استكشاف مكتبة مفتوحة المصدر للقيام بهذه المهمة ، فإليك واحدة

Cinchoo ETL يجعل من السهل تحويل JSON إلى CSV مع بضعة أسطر من التعليمات البرمجية

using (var r = new ChoJSONReader("sample.json"))
{
    using (var w = new ChoCSVWriter("sample.csv").WithFirstLineHeader())
    {
        w.Write(r);
    }
}

لمزيد من المعلومات / المصدر ، انتقل إلى https://github.com/Cinchoo/ChoETL

حزمة Nuget:

.الإطار الصافي:

      Install-Package ChoETL.JSON

.NET Core:

      Install-Package ChoETL.JSON.NETStandard

الإفصاح الكامل: أنا مؤلف هذه المكتبة.


Answer #2

لقد تمكنت من حلها بواسطة DeserializeObject إلى datatable باستخدام Json.net ، لذلك أريد نشر إجابتي الخاصة ولكن لن يتم تمييزها على أنها مقبولة ، إذا كان لدى أي شخص طريقة أفضل للقيام بذلك.

لتحويل سلسلة JSON إلى DataTable

public static DataTable jsonStringToTable(string jsonContent)
        {
            DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonContent);
            return dt;
        }

لجعل سلسلة CSV

public static string jsonToCSV(string jsonContent, string delimiter)
        {
            StringWriter csvString = new StringWriter();
            using (var csv = new CsvWriter(csvString))
            {
                csv.Configuration.SkipEmptyRecords = true;
                csv.Configuration.WillThrowOnMissingField = false;
                csv.Configuration.Delimiter = delimiter;

                using (var dt = jsonStringToTable(jsonContent))
                {
                    foreach (DataColumn column in dt.Columns)
                    {
                        csv.WriteField(column.ColumnName);
                    }
                    csv.NextRecord();

                    foreach (DataRow row in dt.Rows)
                    {
                        for (var i = 0; i < dt.Columns.Count; i++)
                        {
                            csv.WriteField(row[i]);
                        }
                        csv.NextRecord();
                    }
                }
            }
            return csvString.ToString();
        }

الاستخدام النهائي في الويب API

string csv = jsonToCSV(content, ",");

                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                result.Content = new StringContent(csv);
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "export.csv" };
                return result;

Answer #3
public void Convert2Json() 
        { 
            try 
            { 
                if (FileUpload1.PostedFile.FileName != string.Empty) 
                { 
                    string[] FileExt = FileUpload1.FileName.Split('.'); 
                    string FileEx = FileExt[FileExt.Length - 1]; 
                    if (FileEx.ToLower() == "csv") 
                    { 
                        string SourcePath = Server.MapPath("Resources//" + FileUpload1.FileName); 
                        FileUpload1.SaveAs(SourcePath); 
                        string Destpath = (Server.MapPath("Resources//" + FileExt[0] + ".json")); 

                        StreamWriter sw = new StreamWriter(Destpath); 
                        var csv = new List<string[]>(); 
                        var lines = System.IO.File.ReadAllLines(SourcePath); 
                        foreach (string line in lines) 
                            csv.Add(line.Split(',')); 
                        string json = new 
                            System.Web.Script.Serialization.JavaScriptSerializer().Serialize(csv); 
                        sw.Write(json); 
                        sw.Close(); 
                        TextBox1.Text = Destpath; 
                        MessageBox.Show("File is converted to json."); 
                    } 
                    else 
                    { 
                        MessageBox.Show("Invalid File"); 
                    } 

                } 
                else 
                { 
                    MessageBox.Show("File Not Found."); 
                } 
            } 
            catch (Exception ex) 
            { 
                MessageBox.Show(ex.Message); 
            } 
        }




csvhelper