【问题标题】:C# manipulating data parsed from CSVC# 操作从 CSV 解析的数据
【发布时间】:2021-01-21 20:37:45
【问题描述】:

我正在创建一个程序来根据用户输入生成示意图。由于不同可能性的庞大数量(6.8M,呈指数增长),这必须动态/手动完成。现在我正在通过 CSV 导入一些数据。

示例数据:

Type,TIN_pos,TIN_ID,Desc
Elect, 0, X, Manual Regulator
Elect, 0, A, Electronic Regulator

导入代码:

List<TIN_Fields> values = File.ReadAllLines("C:\\Users\\User\\Desktop\\Visual Basic\\CSV_Test_1.csv")
                    .Skip(1)
                    .Select(v => TIN_Fields.FromCsv(v))
                    .ToList();

public class TIN_Fields
{
    public string Type;
    public int TIN_pos;
    public string TIN_ID;
    public string Desc;

    public static TIN_Fields FromCsv(string csvLine)
    {
        string[] values = csvLine.Split(',');
        TIN_Fields _Fields = new TIN_Fields();
        _Fields.Type = Convert.ToString(values[0]);
        _Fields.TIN_pos = Convert.ToInt16(values[1]);
        _Fields.TIN_ID = Convert.ToString(values[2]);
        _Fields.Desc = Convert.ToString(values[3]);
        return _Fields;
    }
}

导入数据后,我需要用它做两件事,

  1. 在 ListView 表中显示原始 csv 数据,以便用户查看列表中是否有任何内容需要更新。

  2. 能够将列表中的项目与10位十六进制代码中的各种字符进行比较,并吐出一些结果。

首先,我需要遍历使用上述代码创建的列表,确保:

TIN_pos 值 = 0

因为那是输入框的字符位置。

然后,使用其余选项,在 TIN_ID 字段中查找输入中表示的字符。 一旦找到,它应该输出 Desc 字段。

我看过的所有地方都说要使用 foreach,但这需要数组名称,这是让我感到困惑的部分。我已经尝试在 FromCSV 方法中填写基本上所有的变量,并且通常会收到一个错误,即该类没有定义。

希望能消除我对解释的混淆,这是我创建的代码,它做同样的事情,但使用 switch case 和 if 语句将 CSV 数据硬编码到其中。

 public partial class Form1 : Form
    {
        public string Model_Chassis;
        public string Model_Test_Type;
        public int ChannelNumberVar => Convert.ToInt32(TextBox_TIN[2]);
        public string Tester_Type_Selector;
        public string TextBox_TIN 
        {
            get { return TIN_Entry_TextBox.Text; }
            set { TIN_Entry_TextBox.Text = value; }
        }

        public string Model_Data_D
        {
            get { return Model_Data.Text; }
            set { Model_Data.Text = value; }
        }

        public Form1()
        {
            InitializeComponent();
        }
        //Method grabs TIN Box data and decodes it to model information.
        public void Model_Select()
        {
            //Picks Model Chassis
            switch (char.ToUpper(TextBox_TIN[0]))
            {
                case 'H':
                    {
                        Model_Chassis = Coding.Model1.description;
                    }
                    break;
                default:
                    {
                        Model_Data_D = "INVALID TIN";
                    }
                    break;

            }

            //Picks Test Type
            switch (char.ToUpper(TextBox_TIN[3]))
            {
                case '0':
                    {
                        Model_Test_Type = Test_Types.TT_PD.TT_tt;
                    }
                    break;
                case '1':
                    {
                        Model_Test_Type = Test_Types.TT_PV.TT_tt;
                    }
                    break;
                default:
                    {
                        Model_Test_Type = "";
                    }
                    break;
            }

            //Puts chassis and Test Type together
            if (Model_Data_D.Equals("INVALID TIN"))
            {
                ;
            }
            else if (char.ToUpper(TextBox_TIN[2]).Equals(Coding.Num_Chan_1_2.tin_id))
            {
                Model_Data_D = $"{Model_Chassis}-{Model_Test_Type}";
            }
            else
            {
                Model_Data_D = $"{Model_Chassis}-{TextBox_TIN[2]}{Model_Test_Type}";
            }
        }
    public class Coding
    {
        public char tin_id;
        public string description;

        public Coding(char TIN_ID, string Desc)
        {
            tin_id = TIN_ID;
            description = Desc;
        }

       public static Coding Model1 = new Coding('H', "Model1");
       public static Coding Num_Chan_1_2 = new Coding('X', "Single Channel");
       public static Coding Elect_Reg_F_1 = new Coding('X', "Manual Regulator");
     }
  }

输入:

HXX0X

输出

Model1-PD

提前感谢您的帮助!

【问题讨论】:

    标签: c# csv parsing data-manipulation


    【解决方案1】:

    假设您已正确读取 CSV(看起来您已经正确),然后从列表中选择适当的 TIN 是一个简单的 LINQ 语句。以下代码假定 TIN ID 是唯一的并且长度只有一个字符。

        static void Main(string[] args)
        {
            string testCsv = @"C:\Users\User\Desktop\Visual Basic\CSV_Test_1.csv";
    
            List<TIN_Fields> values = File.ReadAllLines(testCsv)
                   .Skip(1)
                   .Select(v => TIN_Fields.FromCsv(v))
                   .ToList();
    
            // Simulates input received from form
            string input = "HXX0X";
    
            TIN_Fields selectedTIN = values.First(x => x.TIN_ID == Convert.ToString(input[0]));
    
            // Insert the description as needed in your ouput.
            string output = $"{ selectedTIN.Desc }-";
    
        }
    

    希望这能回答问题的另一部分。 Convert.ToString() 是必需的,因为input[0] 的输出是char

    【讨论】:

    • 感谢您的帮助! TIN_ID 不是唯一的,但我通过在 LINQ 语句中使用 AND 语句使其工作。TIN_Fields STIN_0 = values.Find(x =&gt; x.TIN_pos == "0" &amp;&amp; x.TIN_ID == Convert.ToString(char.ToUpper(TIN_Text[0])));
    【解决方案2】:

    你问了很多问题,并在这里提供了很多额外的细节,但是对于这个:

    “首先,我需要遍历使用上述代码创建的列表,确保: TIN_pos 值 = 0 因为那是输入框的字符位置。”

    (正如您所说,您需要“首先”这样做)。

    在您的FromCsv 方法中,在创建记录时检查值,如果无效则抛出错误。像这样:

     public static TIN_Fields FromCsv(string csvLine)
        {
            string[] values = csvLine.Split(',');
            TIN_Fields _Fields = new TIN_Fields();
            _Fields.Type = Convert.ToString(values[0]);
    
            _Fields.TIN_pos = Convert.ToInt16(values[1]);
    
            if(_Fields.TIN_pos != 0){
                throw new Exception("TIN_pos must be 0");
            }
    
            _Fields.TIN_ID = Convert.ToString(values[2]);
            _Fields.Desc = Convert.ToString(values[3]);
            return _Fields;
        }
    

    【讨论】:

    • 我想你的意思是!=
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多