按列读取文本文件
本文关键字:文件 取文本 读取 | 更新日期: 2023-09-27 18:26:26
我有一个文本文件,其中包含以下方式的数据。我想使用c#逐列读取此文件。
tvID |acdID| logonID |agentName |modify |exception|start|stop |externalID
70118349|1 |19131187356|Reed,Debrielle |1375205999|Open |12:33|14:25|USWDER59
70118349|1 |19131187356|Reed, Debrielle|1375213297|Meeting |14:25|14:39|USWDER59
70118349|1 |19131187356|Reed, Debrielle|1375214248|Open |14:39|15:07|USWDER59
70118349|1 |19131187356|Reed, Debrielle|1375215830|Break |15:07|15:21|USWDER59
例如,我想把所有的数据都放在起始标题下,如下所示:
start
12:33
14:25
14:39
15:07
有人能帮我吗。
您必须逐行读取,并用列分隔符(|)分隔
string [] columns;
using(StreamReader sr = new StreamReader("path_to_file"))
{
line=sr.ReadLine().Split('|');
if(line.Length>6)
//line[6] is your time data
//Do something with this
}
File是一个顺序设备,您需要逐个字符地读取它——没有直接的方法将其作为内存进行寻址。
您可以逐行读取,然后调用String.Split
函数,然后您可以访问您需要的字段:
var lines = File.ReadLines(fileName);
foreach (var line in lines)
{
var fields = line.Split(new char[]{ '|' });
System.out.println(fields[6]); // Use appropriate index here.
}
您的最佳选择可能是为数据定义一个数据结构,并将整个文件(或至少是您想要的部分)读取到该结构中。然后,您可以与内存中的结构进行交互,并根据需要对其进行操作。
例如,您可以定义一个类,例如:
public class SomeObject // give it a more meaningful name, of course
{
public DateTime Start { get; set; }
public DateTime Stop { get; set; }
}
然后,您可能会向该类添加一个静态工厂,该工厂从给定的字符串中反序列化(应用程序从文件中获得该字符串,因为类本身不应该知道文件,而应该只知道其中的数据)。它可以是简单的事情,比如从文件中读取所有行,并将行的枚举传递给工厂方法。然后,工厂方法将解析每一行的数据。
看起来数据是管道交付的,所以像这样的事情可能是一个好的开始:
public static SomeObject Deserialize(IEnumerable<string> input)
{
var result = new SomeObject();
foreach (var dataLine in input.Skip(1))
{
var dataElements = dataLine.Split('|');
result.Start = DateTime.Parse(dataElements.Skip(6).First());
result.Stop = DateTime.Parse(dataElements.Skip(7).First());
}
return result;
}
您可能还想在输入上添加一些错误检查,如果数据不总是可以直接解析的话,可以在数据上使用TryParse
,在这里或那里进行一些防御性编程。但你明白了。
然后操作内存中的数据就变得微不足道了。例如,您可以从以下对象的列表中获取Start
列:
var startTimes = listOfObjects.Select(o => o.Start);