我有一个包含以下方式数据的文本文件。我想使用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
任何人都可以帮我这个。
答案 0 :(得分:1)
您必须逐行阅读,将每个分区拆分为列分隔符(|)
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
}
答案 1 :(得分:1)
文件是一个顺序设备,您需要逐个字符地读取它 - 没有直接的方法将其作为内存来处理。
您可以逐行阅读,然后拨打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.
}
答案 2 :(得分:1)
您最好的选择可能是为数据定义数据结构并将整个文件(或至少是您想要的部分)读入该结构。然后,您可以在内存中与该结构进行交互,并根据需要对其进行操作。
例如,您可以定义一个类,例如:
public class SomeObject // give it a more meaningful name, of course
{
public DateTime Start { get; set; }
public DateTime Stop { get; set; }
}
然后你可能会向该类添加一个静态工厂,该工程从给定的字符串反序列化(应用程序从文件中获取,因为类本身不应该知道文件而只知道文件中的数据) 。它可以像reading all the lines from the file一样简单,并将行的枚举传递给该工厂方法。然后该工厂方法将parse each line用于数据。
看起来数据是管道分隔的,所以这样的事情可能是一个好的开始:
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);