按列读取文本文件

时间:2013-08-04 11:13:16

标签: c#

我有一个包含以下方式数据的文本文件。我想使用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

任何人都可以帮我这个。

3 个答案:

答案 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);