我有一个带有一些列和行的制表符分隔文件,例如:某些行可能没有某些列的值。 我们所知道的是“订单”并没有改变所以第三个制表符分隔的东西总是用于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
中使用值来做一些事情你建议采用什么方法?
答案 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]
}
}