如何从带有C#分隔符的文本文件(.txt)中获取特定列

时间:2019-05-28 01:44:01

标签: c# text-files

我有这样的示例数据,该数据在文本文件(.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)));
}

也许有人可以提供帮助?谢谢

2 个答案:

答案 0 :(得分:2)

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

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,';');

输出

enter image description here

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

答案 1 :(得分:0)

尝试一下。

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}");
        }