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

C# 从txt文件中拆分列的最简单方法是什么,c#,arrays,string,list,split,C#,Arrays,String,List,Split,我一直在四处寻找,但还没有找到一个好的例子,我现在正在努力 我有一个.txt文件,其中有两列,如下所示: # ID,YYYYMMDD, COLD,WATER, OD, OP, 52,20120406, 112, 91, 20, 130, 53,20130601, 332, 11, 33, 120, 我正在将这些从文件中读取到字符串[]数组中。 我想把它们分成一个列表 比如说 列出结果,[0]索引将是列的第一个索引 results[0].ID

我一直在四处寻找,但还没有找到一个好的例子,我现在正在努力

我有一个.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
}
string[]line=File.ReadAllLines(路径);
列表结果=新列表();
//总线=包含所有变量的类
//例如Bus.ID、Bus.COLD、Bus.YYYYMMDD
foreach(一行接一行){
var val=line.Split(\\s+);
//不知道从这里到哪里去
}
非常感谢您的帮助

亲切的问候,恶意的。

我愿意

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 l=新列表();
foreach(一行接一行)
{
var sp=行分割(',');
var foo=新foo
{
Id=int.Parse(sp[0].Trim()),
Date=sp[1].Trim(),//或将日期标记为日期时间结构
Cold=double.Parse(sp[2].Trim())
}
l、 添加(foo);
}
//现在我包含了一个充满Foo对象的列表

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

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);
}
var columnMap=new[]{“ID”、“YYYYMMDD”、“COLD”、“WATER”、“OD”、“OP”};
var properties=columnMap.Select(typeof(Bus).GetProperty.ToList();
var resultList=新列表();
foreach(行中的var行)
{
var val=行分割(',');
var adding=新总线();
对于(int i=0;ip.SetValue(加法,val[i]);
}
结果列表.添加(添加);
}

这是假设您的所有属性都是字符串,但是类似这样的内容可能

results.Add(new Bus
    {
        ID = val[0],
        YYYYMMDD = val[1],
        COLD = val[2],
        WATER = val[3],
        OD = val[4],
        OP = val[5]
    });
请记住,此时val数组中的所有值仍然是字符串。如果总线的属性是类型化的,您将需要将它们解析为正确的类型,例如,假设ID是类型化的int

ID = string.IsNullOrEmpty(val[0]) ? default(int) : int.Parse(val[0]),
此外,如果列标题实际出现在文件的第一行中,则需要跳过/忽略该行,并处理其余部分。

我建议使用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();
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])
        ));
}
列表结果=文件
.ReadLines(@“C:\MyFile.txt”)//我们不需要一次读取所有行
.Skip(1)//跳过文件的标题
.Select(line=>line.Split(','))
.Select(items=>newbus(//TODO:检查构造函数的语法
int.Parse(项目[1]),
int.Parse(第[3]项),
DateTime.ParseExact(项[2],“yyyyMMdd”,CultureInfo.InvariantCulture)))
.ToList();

假设我们有
总线
类,其中包含文本文件中的所有变量:

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 = 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();
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])
        ));
}

我希望这能有所帮助。

有很多好的CSV解析器,它们将返回键入的数据。CSVHelper是一个示例,将它们加载到二维结构中。一次一行:取第一行,将其拆分并插入第一行。花一秒钟,将其拆分并插入下一行。依此类推。根据您对数据的处理方式,使用OleDb查询数据可能会更容易。我想您的意思是
SetValue(adding,val[I])int.Parse(sp[0].Trim())时,code>是冗余的(
Parse()
足够智能)