按列读取文本文件

本文关键字:文件 取文本 读取 | 更新日期: 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);