CSVファイルを扱っていると、
- データの本体が途中の行(例:36行目)から始まっている
- すべての列ではなく、特定の列だけ取得したい
といったケースに出くわすことがあります。
私の場合、36行目から始まるCSVの22番目の列の値だけを抽出する必要がありました。
今回はその方法についてご紹介いたします。
目次
目的
- CSVの先頭35行は無視する(コメントやヘッダーなど)
- 36行目以降にあるデータの「22列目(インデックス21)」だけを取り出す
- 必要に応じてその値を加工し、新しいリストに保存する
使用した方法:StreamReader + Split + List<string>
StreamReader でCSVファイルを1行ずつ読み取りながら、36行目以降に処理を適用し、22列目の値を取り出すコードです。
実際のコード例
using System;
using System.Collections.Generic;
using System.IO;
List<string> newLines = new List<string>();
using (var reader = new StreamReader("sample.csv"))
{
// 最初の35行を読み飛ばす
for (int i = 0; i < 35; i++)
{
reader.ReadLine(); // 読み捨て(必要に応じて保存しない)
}
// 36行目以降の処理
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(',');
// 22番目の列が存在し、数値としてパース可能な場合
if (values.Length > 21 && double.TryParse(values[21], out double value))
{
// 必要に応じて加工してリストに追加
string newLine = $"{value}";
newLines.Add(newLine);
}
}
}
ポイント解説
ReadLine()を35回呼び出して、36行目から処理開始Split(',')を使って列を分解values[21]で**22列目の値(0始まり)**を取得double.TryParse()を使って、数値変換可能なデータだけを処理List<string>に抽出値を保存して、後で別ファイルに出力も可能
応用例
values[21]をDateTime.TryParse()で日時型に変換newLine = $"{DateTime.Parse(values[21]).ToString("yyyy-MM-dd")}"などで整形- 列の条件に応じてフィルタ処理(if文を追加)
StreamWriterを使って新しいCSVファイルとして出力
まとめ
C#でCSVを扱うとき、次のようなニーズに対応できます:
- 行数を指定してスキップ:
for+ReadLine() - 特定の列だけ抽出:
Split(',')+values[index] - 型チェック:
TryParse()
単純なCSVであれば、StreamReader と Split だけで十分に処理可能です。
大量データやパフォーマンスが気になる場合は、CsvHelperなどのライブラリの使用も検討してみてください。
技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。
プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。
気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。
