从txt文件中拆分列的最简单方法是什么?

时间:2016-07-29 18:54:38

标签: c# arrays string list split

我一直在四处寻找,但还没有找到我现在正在努力的好榜样。

我有一个带有几列的.txt文件,如下所示:

/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home/bin/java...
Testing started at 2:50 PM ...
in beforeAll
test 1
in afterAll
in beforeAll
test2
in afterAll

Process finished with exit code 0

我正在从文件中读取这些字符串[]数组。 我想将它们分成一个列表 例如

列出结果,[0]索引将是列的第一个索引

#   ID,YYYYMMDD, COLD,WATER,   OD,   OP,
    52,20120406,  112,   91,   20,  130,
    53,20130601,  332,   11,   33,  120,

等。

现在我一直在环顾四周,想出了results[0].ID results[0].COLD 分裂 但是我不确定如何处理它,因为每个条目都在另一个条目下。

"\\\s+"

非常感谢任何帮助!

亲切的问候,有毒。

5 个答案:

答案 0 :(得分:1)

我建议使用 Linq ,如下所示:

  List<Bus> results = File
    .ReadLines(@"C:\MyFile.txt") // we have no need to read All lines in one go
    .Skip(1)                     // skip file's title
    .Select(line => line.Split(','))
    .Select(items => new Bus(    //TODO: check constructor's syntax
       int.Parse(items[1]),
       int.Parse(items[3]),  
       DateTime.ParseExact(items[2], "yyyyMMdd", CultureInfo.InvariantCulture)))
    .ToList();

答案 1 :(得分:0)

我愿意

public class Foo
{
    public int Id {get; set;}
    public string Date {get; set;}
    public double Cold {get; set;}
    //...more
}

然后阅读文件

var l = new List<Foo>();
foreach (line in lines)
{
    var sp = line.Split(',');
    var foo = new Foo
    {
       Id = int.Parse(sp[0].Trim()),
       Date = sp[1].Trim(),//or pharse the date to a date time struct
       Cold = double.Parse(sp[2].Trim())
    }
    l.Add(foo);
}

//now l contains a list filled with Foo objects

答案 2 :(得分:0)

我可能会保留一个属性列表并使用反射来填充对象,如下所示:

var columnMap = new[]{"ID","YYYYMMDD","COLD","WATER","OD","OP"};
var properties = columnMap.Select(typeof(Bus).GetProperty).ToList();

var resultList = new List<Bus>();

foreach(var line in lines)
{
     var val = line.Split(',');
     var adding = new Bus();
     for(int i=0;i<val.Length;i++)
     {
         properties.ForEach(p=>p.SetValue(adding,val[i]));
     }

     resultList.Add(adding);
}

这假设您的所有属性都是字符串

答案 3 :(得分:0)

这样的事可能......

results.Add(new Bus
    {
        ID = val[0],
        YYYYMMDD = val[1],
        COLD = val[2],
        WATER = val[3],
        OD = val[4],
        OP = val[5]
    });

请记住,此时val数组中的所有值仍然是字符串。如果键入了Bus的属性,则需要将它们解析为正确的类型,例如假设ID被输入为int ...

ID = string.IsNullOrEmpty(val[0]) ? default(int) : int.Parse(val[0]),

此外,如果列标题实际存在于第一行的文件中,则您需要跳过/忽略该行并处理其余行。

答案 4 :(得分:0)

鉴于我们的Bus类包含文本文件中的所有变量:

class Bus
{
    public int id;
    public DateTime date;
    public int cold;
    public int water;
    public int od;
    public int op;

    public Bus(int _id, DateTime _date, int _cold, int _water, int _od, int _op)
    {
        id = _id;
        date = _date;
        cold = _cold;
        water = _water;
        od = _od;
        op = _op;
    }
}

然后我们可以在结果列表中列出所有这些:

List<Bus> results = new List<Bus>();

foreach (string line in File.ReadAllLines(path))
{
    if (line.StartsWith("#"))
        continue;

    string[] parts = line.Replace(" ", "").Split(','); // Remove all spaces and split at commas

    results.Add(new Bus(
        int.Parse(parts[0]),
        DateTime.ParseExact(parts[1], "yyyyMMdd", CultureInfo.InvariantCulture),
        int.Parse(parts[2]),
        int.Parse(parts[3]),
        int.Parse(parts[4]),
        int.Parse(parts[5])
        ));
}

并根据需要访问值:

results[0].id;
results[0].cold;
//etc.

我希望这会有所帮助。