繁体   English   中英

C#读取一个csv文件并传递数据

[英]C# reading a csv file and passing the data

我正在开发一个将在AD中创建用户的应用程序。 现在,我可以一次创建一个用户。 现在,我正在尝试通过CSV文件批量创建用户。

经过一些研究,看起来就像使用Microsoft.VisualBasic.FileIO; TextFieldParser是执行此操作的最简单方法。

CSV文件头的方式如下:

FFirstName,LastName,Description,Password,OU,Group

这是我到目前为止的内容:

私人无效CreateUsers_Click(对象发送者,EventArgs e){

        using ( TextFieldParser csvReader = new TextFieldParser ( userscsv ) )
        {
            csvReader.TrimWhiteSpace = true;
            csvReader.TextFieldType = FieldType.Delimited;
           // csvReader.SetDelimiters ( new string [] { "," } );
            csvReader.SetDelimiters ( "," );



            // reading column fields 
            string [] colFields = csvReader.ReadFields ( );

            int index_FirstName = colFields.ToList ( ).IndexOf ( "FirstName" );

            while ( !csvReader.EndOfData )
            {
                // reading user fields 
                string [] fieldData = csvReader.ReadFields ( );

                AD_Add_User_to_Group.Biz.AdAcctManagement bt = new Biz.AdAcctManagement ( );

                try
                {
                    bt.CreateUser ( this.oulist.Text, this.txtDisplayName.Text, this.txtPassword.Text, this.txtFirstName.Text, this.txtLastName.Text );


                }
                catch ( Exception ex )
                {
                }
            }
        }
    }

如何从CSV读取值并将其传递给我的方法:

bt.CreateUser ( this.oulist.Text, this.txtDisplayName.Text, this.txtPassword.Text, this.txtFirstName.Text, this.txtLastName.Text );

而不是this.txtFirtName.Text,我想传递CSV文件中的名字。

让我假设CSV文件的格式为:

someValue,DisplayName,Password,FirstName,LastName

如果是这样,您可以使用以下代码完全满足要求:

foreach (string csvLines in File.ReadAllLines("Path here"))
        {
            //Here  csvItem is each Line in the CSV file
            string[] csvItems = csvLines.Split(',').ToArray();
            bt.CreateUser(csvItems[0], csvItems[1], csvItems[2], csvItems[3], csvItems[4]);
        }

另一种更简单的方法是使用CsvHelper。 您可以从NuGet安装它,它非常易于使用和灵活。 我开始使用CsvHelper,因为它在读取数据时支持类型转换,并且还具有许多其他有用的功能。 下面是您的方案的示例代码。 您可以在磁盘上提供CSV文件的路径。 在大多数情况下,我更喜欢使用嵌入式资源。 该代码未编译,但足以给您思想,

    var assembly = Assembly.GetExecutingAssembly();     

    var resourceName = "<ProjectName>.<FolderName>.UsersList.csv";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                var csv = new CsvReader(reader);
                csv.Configuration.Delimiter = ",";
                csv.Configuration.HasHeaderRecord = true;
                csv.Configuration.IgnoreHeaderWhiteSpace = true;
                csv.Configuration.IgnoreQuotes = false;
                csv.Configuration.IsHeaderCaseSensitive = false;
                csv.Configuration.ThrowOnBadData = true;
                csv.Configuration.QuoteAllFields = true;

                csv.Configuration.RegisterClassMap<UsersClassMap>();
                csv.Configuration.IgnoreReadingExceptions = true;
                csv.Configuration.SkipEmptyRecords = false;
                List<User> records = csv.GetRecords<User>().ToList();

                foreach (User user in records)
                {
                    bt.Create(user.FFirstName, user.lastName, user.Description, user.Password, user.OU, user.Group);
                }
            }
        }

public class User
    {
        public string FFirstName { get; set; }
        public string LastName { get; set; }
        public string Description { get; set; }
        public string Password { get; set; }
        public string OU { get; set; }
        public string Group { get; set; }
    }

public class UsersClassMap : CsvClassMap<User>
    {
        public UsersClassMap()
        {
               Map(x => x.FFirstName).Index(0).Name("FFirstName");
               Map(x => x.LastName).Index(1).Name("LastName");
               Map(x => x.Description).Index(2).Name("Description");
               Map(x => x.Password).Index(3).Name("Password");            
               Map(x => x.OU).Index(4).Name("OU");    
               Map(x => x.Group).Index(5).Name("Group");    
            }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM