【问题标题】:how to take specific column from text file(.txt) with delimiters with C#如何从带有 C# 分隔符的文本文件(.txt)中获取特定列
【发布时间】:2019-05-28 10:21:34
【问题描述】:

我有这样的示例数据,数据在文本文件(.txt)中,我得到了这种类型的文件,如果它的 excel 或 csv 可能会更容易

编辑:我用 C# 制作了一个控制台应用程序

FamilyID;name;gender;DOB;Place of birth;status
1;nicky;male;01-01-1998;greenland;married
1;sonia;female;02-02-1995;greenland;married
2;dicky;male;04-01-1995;bali;single
3;redding;male;01-05-1996;USA;single
3;sisca;female;05-03-1994;australia;married

我想从该数据中获取特定列,例如我想获取 FamilyID、姓名和状态。

我已经尝试了一些代码来读取数据并获取所有数据并将其列出到新的文本文件中。

目标是根据家庭 ID 创建一个新的文本文件,并且只采用特定的列。

问题是:我无法从文本文件中获取我想要的特定列(不知道如何在我编写的代码中选择多个列)

DateTime date = DateTime.Now;
            string tgl = date.Date.ToString("dd");
            string bln = date.Month.ToString("d2");
            string thn = date.Year.ToString();
            string tglskrg = thn + "/" + bln + "/" + tgl;

            string filename = ("C:\\Users\\Documents\\My Received Files\\exampledata.txt");
            string[] liness = File.ReadAllLines(filename);
            string[] col;

            var lines = File.ReadAllLines(filename);


            var groups = lines.Skip(1)
                  .Select(x => x.Split(';')) 
                  .GroupBy(x => x[0]).ToArray();


            foreach (var group in groups)
            {
                Console.WriteLine(group);
                File.WriteAllLines(@"C:\\Users\\Documents\\My Received Files\\exampledata_"+group.Key+".txt", group.Select(x => string.Join(";", x)));
}

也许有人可以帮忙?谢谢你

【问题讨论】:

    标签: c# text-files


    【解决方案1】:

    解决此问题的一种方法是将详细信息捕获到数据结构中,然后将所需的详细信息写入文件。例如,

    public class Detail
    {
        public int FamilyID{get;set;}
        public string Name{get;set;}
        public string Gender{get;set;}
        public DateTime DOB{get;set;}
        public string PlaceOfBirth{get;set;}
        public string Status{get;set;}
    }
    

    现在你可以编写一个基于分隔符解析字符串并返回一个 IEnumerable 的方法。

    public IEnumerable<Detail> Parse(string source,char delimiter)
    {
        return source.Split(new []{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries)
              .Skip(1)
              .Select(x=> 
              {
                var detail = x.Split(new []{delimiter});
                return new Detail
                {
                    FamilyID = Int32.Parse(detail[0]),
                    Name = detail[1],
                    Gender = detail[2],
                    DOB = DateTime.Parse(detail[3]),
                    PlaceOfBirth = detail[4],
                    Status = detail[5]
                };
              }
              );
    
    }
    

    客户电话

    Parse(stringFromFile,';');
    

    输出

    现在您可以从集合中选择并写入要写入输出文件的详细信息。

    【讨论】:

    • 嗯它适用于控制台应用程序吗?
    • 无论console/winform/wpf/web如何,你都可以使用它。请注意,所附图像是输出的代表。您可以使用控制台应用程序输出集合或写入文件
    【解决方案2】:

    试试这个。

    var list = new List<String>();
            list.Add("FamilyID;name;gender;DOB;Place of birth;status");
            list.Add("1;nicky;male;01-01-1998;greenland;married");
            list.Add("1;sonia;female;02-02-1995;greenland;married");
            list.Add("2;dicky;male;04-01-1995;bali;single");
            list.Add("3;redding;male;01-05-1996;USA;single");
            list.Add("3;sisca;female;05-03-1994;australia;married");
    
            var group = from item in list.Skip(1)
                        let splitItem = item.Split(';', StringSplitOptions.RemoveEmptyEntries)
                        select new
                        {
                            FamilyID = splitItem[0],
                            Name = splitItem[1],
                            Status = splitItem[5],
                        };
    
            foreach(var item in group.ToList())
            {
                Console.WriteLine($"Family ID: {item.FamilyID}, Name: {item.Name}, Status: {item.Status}");
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多