【问题标题】:CSV to JSON in C#C# 中的 CSV 到 JSON
【发布时间】:2017-08-18 21:08:45
【问题描述】:

我使用了在线转换器,但它们并不能完全满足我的需要,所以我希望编写一个小程序来让它以我需要的确切格式将 csv 转换为 json。 那么让我们从 csv 文件开始:

Id,Sea,First,Last,Team,Coll,Num,Age,Hgt,Wgt,Pos,Attr/Str,Attr/Agi,Attr/Arm,Attr/Spe,Attr/Han,Attr/Intel,Attr/Acc,Attr/PBl,Attr/RBl,Attr/Tck,Attr/KDi,Attr/KAc,Attr/End,Per/Lea,Per/Wor,Per/Com,Per/TmPl,Per/Spor,Per/Soc,Per/Mny,Per/Sec,Per/Loy,Per/Win,Per/PT,Per/Home,Per/Mkt,Per/Mor,Skills/QB,Flg,Trait,Skills/RB,Skills/FB,Skills/G,Skills/T,Skills/C,Skills/WR,Skills/TE,Skills/CB,Skills/SS,Skills/FS,Skills/DE,Skills/LB,Skills/DT,Skills/K,Skills/P
,2018,David,Bush,,Stanford,19,21,76,212,QB,68,55,89,70,31,96,99,1,5,24,1,1,74,34,71,62,33,76,88,15,15,40,14,31,33,9,94,,,,,,,,,,,,,,,,,,

现在这是 json 中的输出:

{
"Players": [{
    "Id": 2938,
    "Sea": 2018,
    "First": "Harold",
    "Last": "Dalton",
    "Team": "0",
    "Coll": "Western Kentucky",
    "Num": 87,
    "Age": 20,
    "Hgt": 76,
    "Wgt": 224,
    "Pos": "WR",
    "Attr": {
        "Str": 59,
        "Agi": 79,
        "Arm": 1,
        "Spe": 87,
        "Han": 77,
        "Intel": 38,
        "Acc": 1,
        "PBl": 1,
        "RBl": 11,
        "Tck": 21,
        "KDi": 1,
        "KAc": 1,
        "End": 58
    },
    "Per": {
        "Lea": 62,
        "Wor": 76,
        "Com": 61,
        "TmPl": 58,
        "Spor": 62,
        "Soc": 94,
        "Mny": 92,
        "Sec": 32,
        "Loy": 31,
        "Win": 68,
        "PT": 90,
        "Home": 36,
        "Mkt": 45,
        "Mor": 70
    },
    "Skills": {
        "WR": 53,
        "TE": 31
    },
    "Flg": "None",
    "Trait": "None"
},

是的,它是一个不同的玩家,这不是重点:)

这是我到目前为止的代码,没有转换过程......

    SaveFileDialog sfd = new SaveFileDialog();
    OpenFileDialog ofd = new OpenFileDialog();
    public static string fileName;

    private void open_btn_Click(object sender, EventArgs e)
    {
        ofd.Filter = "CSV Files (.csv)|*.csv";
        ofd.Title = "Open CSV File";

        if (ofd.ShowDialog() == DialogResult.OK)
        {
            richTextBox1.LoadFile(ofd.FileName, RichTextBoxStreamType.PlainText);

            fileName = ofd.FileName;
            open_label.Text = System.IO.Path.GetFileName(fileName);
        }
    }

    private void save_btn_Click(object sender, EventArgs e)
    {
        sfd.Filter = "JSON Files (.json)|*.json";
        sfd.Title = "Save JSON File";

        if (sfd.ShowDialog() == DialogResult.OK)
        {
            //how do I convert the loaded .csv file into the json format below???
        }
    }

    public class Rootobject
    {
        public Player[] Players { get; set; }
    }

    public class Player
    {
        public int Id { get; set; }
        public int Sea { get; set; }
        public string First { get; set; }
        public string Last { get; set; }
        public string Team { get; set; }
        public string Coll { get; set; }
        public int Num { get; set; }
        public int Age { get; set; }
        public int Hgt { get; set; }
        public int Wgt { get; set; }
        public string Pos { get; set; }
        public Attr Attr { get; set; }
        public Per Per { get; set; }
        public Skills Skills { get; set; }
        public string Flg { get; set; }
        public string Trait { get; set; }
    }

    public class Attr
    {
        public int Str { get; set; }
        public int Agi { get; set; }
        public int Arm { get; set; }
        public int Spe { get; set; }
        public int Han { get; set; }
        public int Intel { get; set; }
        public int Acc { get; set; }
        public int PBl { get; set; }
        public int RBl { get; set; }
        public int Tck { get; set; }
        public int KDi { get; set; }
        public int KAc { get; set; }
        public int End { get; set; }
    }

    public class Per
    {
        public int Lea { get; set; }
        public int Wor { get; set; }
        public int Com { get; set; }
        public int TmPl { get; set; }
        public int Spor { get; set; }
        public int Soc { get; set; }
        public int Mny { get; set; }
        public int Sec { get; set; }
        public int Loy { get; set; }
        public int Win { get; set; }
        public int PT { get; set; }
        public int Home { get; set; }
        public int Mkt { get; set; }
        public int Mor { get; set; }
    }

    public class Skills
    {
        public int G { get; set; }
        public int T { get; set; }
        public int C { get; set; }
        public int WR { get; set; }
        public int TE { get; set; }
        public int DT { get; set; }
        public int DE { get; set; }
        public int LB { get; set; }
        public int SS { get; set; }
        public int CB { get; set; }
        public int FS { get; set; }
        public int RB { get; set; }
        public int FB { get; set; }
        public int QB { get; set; }
        public int K { get; set; }
        public int P { get; set; }
    }

【问题讨论】:

  • 我发布的 json 输出直接来自我正在尝试复制的游戏。之前的游戏输出是 csv,所以我正在尝试自己转换它。
  • 如果你只是需要读取一个 CSV 文件,你可以使用 .Net 内置类型TextFieldParser 解释here
  • 好的,但是我如何使第 0 列 = Id、第 1 列 = 海等,等等。我以前在编码时从来没有这样做过,所以我是新手..

标签: c# json csv


【解决方案1】:

这是另一种使用Cinchoo ETL将CSV转换为JSON对象结构的简单方法

首先使用 ChoCSVReader 加载 CSV 文件,它会为您提供代表每个 CSV 行的动态对象列表。然后通过暴露构造函数来将它们转换为 Player 采用 CSV 动态对象并将它们加载到其成员中,如下所示

public class Player
{
    public Player(dynamic obj)
    {
        Id = ChoUtility.CastTo<int>(obj.Id);
        Sea = ChoUtility.CastTo<int>(obj.Sea);
        First = obj.First;
        Last = obj.Last;
        Team = obj.Team;
        Coll = obj.Coll;
        Num = ChoUtility.CastTo<int>(obj.Num);
        Age = ChoUtility.CastTo<int>(obj.Age);
        Hgt = ChoUtility.CastTo<int>(obj.Hgt);
        Wgt = ChoUtility.CastTo<int>(obj.Wgt);
        Pos = obj.Pos;
        Flg = String.IsNullOrEmpty(obj.Flg) ? "None" : obj.Flg;
        Trait = String.IsNullOrEmpty(obj.Trait) ? "None" : obj.Trait;

        Attr = new PlayerAttr();
        Attr.Str = ChoUtility.CastTo<int>(obj.Attr_Str);
        Attr.Agi = ChoUtility.CastTo<int>(obj.Attr_Agi);

        Per = new PlayerPer();
        Per.Lea = ChoUtility.CastTo<int>(obj.Per_Lea);
        Per.Wor = ChoUtility.CastTo<int>(obj.Per_Wor);


        Skills = new PlayerSkills();
        Skills.WR = ChoUtility.CastTo<int>(obj.Skills_WR);
        Skills.TE = ChoUtility.CastTo<int>(obj.Skills_TE);
    }

    public int Id { get; set; }
    public int Sea { get; set; }
    public string First { get; set; }
    public string Last { get; set; }
    public string Team { get; set; }
    public string Coll { get; set; }
    public int Num { get; set; }
    public int Age { get; set; }
    public int Hgt { get; set; }
    public int Wgt { get; set; }
    public string Pos { get; set; }

    public PlayerAttr Attr { get; set; }
    public PlayerPer Per { get; set; }

    public PlayerSkills Skills { get; set; }
    public string Flg { get; set; }
    public string Trait { get; set; }
}  

更新:

public class Players
{
    public Player[] players { get; set; }
}
public class PlayerAttr
{
    public int Str { get; set; }
    public int Agi { get; set; }

}
public class PlayerPer
{
    public int Lea { get; set; }
    public int Wor { get; set; }

}
public class PlayerSkills
{
    public int WR { get; set; }
    public int TE { get; set; }

}

最后使用 ChoJSONWriter 对象来编写最终对象。

using (var p = new ChoCSVReader("Players.csv").WithFirstLineHeader())
{
    using (var w = new ChoJSONWriter<Players>("Players.json").Configure( c=> c.UseJSONSerialization = true).Configure(c => c.SupportMultipleContent = true))
    {
        w.Write(new RootObject { players = p.Select(e => new Player(e)).ToArray() });
    }
}

希望这会有所帮助。

免责声明:我是这个库的作者。

【讨论】:

  • PlayerAttr、PlayerPer 和 PlayerSkills 出现错误?
  • 将缺少的类添加到答案中。
  • 好的,成功了!现在我有另一个问题...它说“参数 1:无法从 'WindowsFormsApplication1.Form1.Players' 转换为 'System.Collections.Generic.IEnumerable'
  • 想通了,在 var w 行中有 Player 而不是 Players... 现在 e 有一个错误说它不能在这个 cope 中声明,因为该名称用于封闭的本地范围定义一个本地或参数......另外,无论如何你可以帮助我使用 csvreader?
  • 错误很明显,您已经在定义的范围内定义了 e 变量。请更换其中之一。
猜你喜欢
  • 2021-12-27
  • 2018-01-13
  • 1970-01-01
  • 2020-07-06
  • 2018-07-30
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多