C# C操作从CSV解析的数据

C# C操作从CSV解析的数据,c#,csv,parsing,data-manipulation,C#,Csv,Parsing,Data Manipulation,我正在创建一个程序,根据用户输入生成示意图。这必须通过动态/手动完成,因为各种可能性的绝对数量为680万,呈指数增长。现在我正在通过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\

我正在创建一个程序,根据用户输入生成示意图。这必须通过动态/手动完成,因为各种可能性的绝对数量为680万,呈指数增长。现在我正在通过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;
    }
}
输入:

HXX0X
输出

Model1-PD

提前感谢您的帮助

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

首先也是最重要的是,我需要运行使用上述代码创建的列表,确保: 锡位置值=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;
    }

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

首先也是最重要的是,我需要运行使用上述代码创建的列表,确保: 锡位置值=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;
    }

假设您已经正确读取了CSV(看起来是这样),那么从列表中选择适当的TIN就是一个简单的LINQ语句。以下代码假定三角网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是必需的,因为输入[0]的输出是一个字符。

假设您已经正确读取了CSV,那么从列表中选择适当的TIN就是一个简单的LINQ语句。以下代码假定三角网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是必需的,因为输入[0]的输出是一个字符。

我想你的意思是!=。我想你是说!=。谢谢你的帮助!TIN_ID不是唯一的,但我通过在LINQ语句中使用AND语句使其工作。TIN_字段STIN_0=values.Findx=>x.TIN_pos==0&&x.TIN_ID==Convert.ToStringchar.toupertin_Text[0];谢谢你的帮助!TIN_ID不是唯一的,但我通过在LINQ语句中使用AND语句使其工作。TIN_字段STIN_0=values.Findx=>x.TIN_pos==0&&x.TIN_ID==Convert.ToStringchar.toupertin_Text[0];