2

何千もの行 (各行約 30 列) を含むテキスト ファイルがあり、いくつかの条件に基づいて目的の行を取得する必要があります。

以下のコードを使用して、テキストファイルからリストにコレクションを準備しました

string[] records = File.ReadAllLines(path);
List<string> listOfStr = new List<string>(records);

各行の特定の列を照会する必要があります...それが基準と一致する場合..そのレコードが必要です.linqを使用してこれを行うにはどうすればよいですか? または他のアプローチ?

4

4 に答える 4

6

File.ReadLines最初にすべてをメモリにロードする代わりに、行をストリーミングする代わりに使用する必要があります。また、ここでは 2 つのメモリ内コレクションを作成しています。

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(',')し、コンマで分割します。Enumerable.ElementAtOrDefault(9)利用可能な場合は 10 列目を返し、そうでない場合nullは を返します。

于 2013-07-08T22:18:21.927 に答える
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();
于 2013-07-08T22:27:32.527 に答える
0

最初に行を列に分割します。

List<string[]> listOfStr = records.Select(s => s.Split('\t')).ToList();

メソッドを使用Whereして、条件でフィルタリングできます。

たとえば、これは 5 番目の列が であるすべての行を除外します"Hello"

List<string[]> result = listOfStr
  .Where(s => s[4] == "Hello")
  .ToList();
于 2013-07-08T22:18:25.367 に答える
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);
    }
}
于 2013-07-08T22:21:56.993 に答える