从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
}
非常感谢您的帮助!
致以亲切的问候,毒枭。
我建议使用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.
我希望这能有所帮助。