解析制表符分隔的文本文件

时间:2014-04-22 17:07:30

标签: c#

我有一个带有一些列和行的制表符分隔文件,例如:某些行可能没有某些列的值。 我们所知道的是“订单”并没有改变所以第三个制表符分隔的东西总是用于Column3,依此类推。

Column1  Column2  Column3 .... Column12 .... Column34 ... Column50
123  34 ABC
234     DEF                                   as@ddd.com    True
     45           NYC                         wwe@dsds.com  False      

现在我需要阅读此文件,但并非所有列对我的程序都很重要。例如,我只需要在Column2,Column12,Column45

中使用值来做一些事情

你建议采用什么方法?

6 个答案:

答案 0 :(得分:4)

不要自己动手。有......微妙之处并不是很明显。其中包括:

  • 引用字段?
  • 包含嵌入字段和/或记录分隔符的数据
  • 错误的长度记录

相反,使用来自Fast CSV Reader的Sebastien Lorion最优秀的CodeProject

编辑注意:尽管名称如此,但这是一个用于分隔文本文件的通用阅读器。可配置项目包括

  • 字段分隔符
  • 记录分隔符
  • 引用字符(引用文字)
  • 转义字符(嵌入式引号)
  • 允许评论的地方。如果启用,注释字符(见下文)将开始注释,以下一个记录分隔符结束。
  • 评论字符(默认情况下为'#')
  • 第一行是否为包含字段名称的标题。

答案 1 :(得分:3)

只需读取文件的所有行,然后在制表符分隔符上拆分,即可访问每列。

   var fileArray = File.ReadAllLines(myLocation);

        for(int i=0;i<fileArray.Length;i++)
        {
           if (i == 0)
           {  
              //handle column names
           }
           else
           {
             var columns = line.Split('\t');
             string value = columns[3];
           }
        }

答案 2 :(得分:3)

您可以使用File.ReadLines()方法(如果您使用的是.NET Framework 4.0或更高版本),而不会造成任何性能损失,因为它不会将整个文件内容加载到内存中。

试试这个:

using System.IO;

class FileData
{
public string Column2{ get; set; }
public string Column12{ get; set; }
public string Column45{ get; set; }
}


List<FileData> filedata =  new List<FileData>();

 FileData temp = new FileData();
 foreach(var line in File.ReadLines("filepath.txt").Skip(1))
 {     
   var tempLine = line.Split('\t');
   temp.Column2 = tempLine[1];
   temp.Column12 = tempLine[11];
   temp.Column45 = tempLine[44]; 
   filedata.Add(temp);
 }

答案 3 :(得分:3)

尝试以下方法

static void Main(string[] args)
{
    DataTable datatable = new DataTable();
    StreamReader streamreader = new StreamReader(@"C:\Temp\txt.txt");
    char[] delimiter = new char[] { '\t' };
    string[] columnheaders = streamreader.ReadLine().Split(delimiter);
    foreach (string columnheader in columnheaders)
    {
        datatable.Columns.Add(columnheader); // I've added the column headers here.
    }

    while (streamreader.Peek() > 0)
    {
        DataRow datarow = datatable.NewRow();
        datarow.ItemArray = streamreader.ReadLine().Split(delimiter);
        datatable.Rows.Add(datarow);
    }

    foreach (DataRow row in datatable.Rows)
    {
        Console.WriteLine(""----Row No: " + datatable.Rows.IndexOf(row) + "----"");

        foreach (DataColumn column in datatable.Columns)
        {
            //check what columns you need
            if (column.ColumnName == "Column2" || 
                column.ColumnName == "Column12" ||
                column.ColumnName == "Column45") 
            {
                Console.Write(column.ColumnName);
                Console.Write(" ");
                Console.WriteLine(row[column]);
            }
        }
    }
    Console.ReadLine();
}

答案 4 :(得分:1)

var list = from row in System.IO.File.ReadLines("file.txt")
           let arr = row.Split('\t')
           select new Tuple<string, string, string>(arr[2], arr[12], arr[45]);

答案 5 :(得分:0)

正如 Nicholas 所说,不要自己动手,因为有微妙之处和特殊情况。

一个选项是 TextFieldParser

using (var parser = new TextFieldParser(filePath))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters("\t");

    while (!parser.EndOfData)
    {
        var cols = parser.ReadFields();
        // Can now access columns, eg cols[0]
    }
}