質問: C#でCSVファイルを読み込を行っています。 想定しているCSVファイルは以下になります。 番号 内容 101 テスト1-1 102 テスト1-2 103 テスト1-3 201 テスト2-1 202 テスト2-2 203 テスト2-3 301 テスト3-1 302 テスト3-2 303 テスト3-3 このようなCSVファイルから番号101 - N番までの内容の読み込みを行いたいと考えております。 番号の総数は決まっておらず101 - 130であったり201 - 205だったりします。 処理としては 1.番号の検索 2.検索した番号の連番から内容の列をdatatableに読み込む 扱うデータ量が多いのでなるべく早い処理を実装したいのですが いい方法はありますでしょうか?
回答: 速いかどうかはわかりませんが、素直に考えると、 1. CSVのテキストを1行ずつ読み取って 2. 行頭の番号を見て 3. 指定の範囲内ならその行をDataTableに突っ込む のような流れになると思います。 ``` using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace ConsoleApp1 { class Program { static void Main(string[] args) { var csv = string.Join("", Enumerable.Range(101, 50).Select(n => $"{n},test{n}\n")) + string.Join("", Enumerable.Range(201, 60).Select(n => $"{n},test{n}\n")) + string.Join("", Enumerable.Range(301, 40).Select(n => $"{n},test{n}\n") + string.Join("", Enumerable.Range(401, 80).Select(n => $"{n},test{n}\n"))); var dt = new DataTable("sampleTable"); dt.Columns.Add("番号"); dt.Columns.Add("内容"); AddDataTableRowsFromCsvText(dt, csv, 215, 240); foreach (DataRow row in dt.Rows) { Console.WriteLine(string.Join(",",row.ItemArray)); } Console.Read(); } private static void AddDataTableRowsFromCsvText(DataTable dt, string csv, int startNumber, int endNumber) { using (var reader = new System.IO.StringReader(csv)) { while (true) { var line = reader.ReadLine(); if (line == null) { break; } var number = line.Substring(0, line.IndexOf(',')); if (!int.TryParse(number, out int n)) { continue; } if (n >= startNumber) { dt.Rows.Add(line.Split(',')); } if (n >= endNumber) { break; } } } } } } ```