我有一个包含1000行的文本文件(每行大约30列),需要根据某些条件拉出所需的行。
使用下面的代码我已经将文本文件中的集合准备好进入List
string[] records = File.ReadAllLines(path);
List<string> listOfStr = new List<string>(records);
我需要查询每一行的特定列...如果匹配条件...我需要该记录... 我怎么能用linq做到这一点?还是其他方法?
答案 0 :(得分:6)
你应该使用File.ReadLines
而不是首先将所有内容加载到内存中。此外,您将在此处创建两个内存中集合:
string[] records = File.ReadAllLines(path);
List<string> listOfStr = new List<string>(records);
这在内存消耗方面更有效:
var matchingLines = File.ReadLines(path)
.Select(l => new{ Parts = l.Split(), Line = l })
.Where(x => x.Parts.ElementAtOrDefault(9) == yourSearch)
.Select(x => x.Line);
foreach (string line in matchingLines)
Console.WriteLine(line);
你没有提到分隔符分隔每个列,我使用了空格,l.Split(',')
将用逗号分隔。 <{1}}如果可用,则返回第10列,否则返回Enumerable.ElementAtOrDefault(9)
。
答案 1 :(得分:0)
首先将行拆分为列:
List<string[]> listOfStr = records.Select(s => s.Split('\t')).ToList();
您可以使用Where
方法过滤条件。
例如,这会过滤掉第五列为"Hello"
的所有行:
List<string[]> result = listOfStr
.Where(s => s[4] == "Hello")
.ToList();
答案 2 :(得分:0)
如果行以逗号分隔,请尝试此操作:
int indexCol = 0; //the index of the col you want to look into
string search = string.Empty; //what you want to search in the column
string lineResult = listOfStr.FirstOfDefault(x=> x.split(",")[indexCol].Contains(search));
其他
string search = string.Empty;
foreach (string line in listOfSrt)
{
string[] inCols = line.Split("\t");
if (inCols[0].Contains(search))
{
Console.WriteLine(line);
}
}
答案 3 :(得分:0)
string[] records = File.ReadAllLines(path);
List<string> listOfStr = new List<string>(records);
List<string> listOfMatches = listOfStr.Where(str => str[YOUR TEST COLUMN].Equals([YOUR TEST VALUE])).ToList();