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

4 c#

我有一个制表符分隔的文件,其中包含一些列和行,例如:某些行可能没有某些列的值。我们所知道的是“顺序”不会改变,所以第三个制表符分隔的东西总是用于 Column3 等等。

Column1  Column2  Column3 .... Column12 .... Column34 ... Column50
123  34 ABC
234     DEF                                   as@ddd.com    True
     45           NYC                         wwe@dsds.com  False      
Run Code Online (Sandbox Code Playgroud)

现在我需要阅读这个文件,但并不是所有的列对我的程序都很重要。例如,我只需要对 Column2、Column12、Column45 中的值做一些事情

你建议什么方法?

use*_*re3 8

尝试以下方法

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();
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*rey 7

不要自己卷。有……微妙之处并不会立即显现出来。其中:

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

相反,使用来自CodeProject 的Sebastien Lorion 最优秀的Fast CSV Reader之类的东西。

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

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

  • 唯一的区别是您对字段和记录分隔符的选择。只需将其配置为使用 HT (`'\t'`) 而不是逗号 (`','`) 作为字段分隔符。 (2认同)

Sud*_*udi 5

您可以使用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);
 }
Run Code Online (Sandbox Code Playgroud)

  • 为什么不只是 `File.ReadLines("filepath.txt").Skip(1))`? (3认同)

dov*_*vid 5

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]);
Run Code Online (Sandbox Code Playgroud)