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

本文关键字:最简单 方法 是什么 拆分 txt 文件 | 更新日期: 2023-09-27 17:59:24

我一直在四处寻找,但还没有找到一个很好的例子来说明我现在正在挣扎的问题。

我有一个.txt文件,其中有以下几列:

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

我正在将这些从文件中读取到字符串[]数组中。我想把它们分成一份清单例如

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

results[0].ID
results[0].COLD

等等。。

现在我环顾四周,想出了"'''s+"拆分但我不知道该怎么做,因为每个条目都在另一个条目下面。

string[] lines = File.ReadAllLines(path);
List<Bus> results = new List<Bus>();
//Bus = class with all the vars in it
//such as Bus.ID, Bus.COLD, Bus.YYYYMMDD
foreach (line in lines) {
  var val = line.Split("''s+");
  //not sure where to go from here
}

非常感谢您的帮助!

致以亲切的问候,毒枭。

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

我建议使用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();

我会做

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

我可能会保留一个属性列表,并使用反射来填充对象,类似于以下内容:

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

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

也许是这样的。。。

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]),

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

假设我们有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.

我希望这能有所帮助。