【C#】.tsvファイルを読み込み、指定行と列だけを抽出・加工して保存する方法

目次

経緯

業務で扱うことが多い .tsvファイル(タブ区切り形式のテキストファイル)を、C#を使ってプログラム的に加工したいと考えました。
特に今回は、

  • 351行目以降を5行ごとに間引き
  • 347〜350行目を先頭に追加
  • 特定の列だけを抽出
  • 加工後のデータを新たなファイルとして出力

というフローを自動化するために、具体的な実装方法を学びました。


処理の全体像

今回の処理手順は以下の通りです。

  1. .tsvファイルを読み込む
  2. 351行目以降を5行おきに抽出
  3. 347~350行目を先頭に追加
  4. 加工後のデータを output.tsv として出力
  5. 指定された列のみを抽出して整形
  6. 整形済みデータを sorted_output.tsv として出力

実装コード(C#)

以下は、上記の処理をすべて実現したコードです。
エンコーディングは Shift-JIS を使用しており、ファイル選択から出力までGUIで完結します。

// ファイル選択ダイアログを表示
OpenFileDialog openFileDialog = new OpenFileDialog
{
    Filter = "TSVファイル (*.tsv)|*.tsv|すべてのファイル (*.*)|*.*",
    Title = "TSVファイルを選択してください"
};

if (openFileDialog.ShowDialog() != DialogResult.OK)
{
    return;
}

string filePath = openFileDialog.FileName;

// ファイルを行単位で読み込み
List<string> originalLines;
using (var sr = new StreamReader(filePath, Encoding.GetEncoding("shift_jis")))
{
    originalLines = sr.ReadToEnd().Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None).ToList();
}

// 351行目以降を5行ごとに間引き
int n = 5;
List<string> reducedLines = new List<string>();
for (int i = 350; i < originalLines.Count; i += n)
{
    reducedLines.Add(originalLines[i]);
}

// 347〜350行目を先頭に追加(3行分)
reducedLines.InsertRange(0, originalLines.GetRange(347, 3));

// デスクトップに出力
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string outputFile = Path.Combine(desktopPath, "output.tsv");
Encoding encoding = Encoding.GetEncoding("shift_jis");
File.WriteAllLines(outputFile, reducedLines, encoding);

// 指定列インデックス(必要に応じてカスタマイズ)
List<int> columnIndices = new List<int> {
    0, 2, 3, 4, 5, 6, 7, 8, 9,
    19, 20, 21, 23, 24, 25, 26,
    28, 29, 33, 44,
    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111
};

// 指定列だけを抽出して再構成
List<string> newLines = new List<string>();
foreach (string line in reducedLines)
{
    string[] cells = line.Split('\t');
    List<string> newLine = new List<string>();
    foreach (int index in columnIndices)
    {
        if (index < cells.Length)
        {
            newLine.Add(cells[index]);
        }
    }
    newLines.Add(string.Join("\t", newLine));
}

// 加工済みデータを別ファイルに保存
string sortedOutputFile = Path.Combine(desktopPath, "sorted_output.tsv");
File.WriteAllLines(sortedOutputFile, newLines, encoding);

MessageBox.Show("終わりました。");

出力されるファイル

  • output.tsv:元データから351行目以降を5行おきに抽出し、347〜350行目を先頭に追加したファイル
  • sorted_output.tsvoutput.tsv の中から指定された列のみを抽出して整形したファイル

どちらも Shift-JIS形式 で、デスクトップに保存されます。


今後の展望

この処理の次のステップとしては、.xlsxファイルへの自動変換や、整形済みデータの可視化などを検討しています。
必要に応じて、ClosedXML などのライブラリを用いてExcel出力へ対応させることも可能です。


まとめ

今回は、.tsvファイルをC#で効率的に加工・整形し、業務で扱いやすい形に再出力する方法をご紹介しました。

特定の行だけ間引いたり、特定の列だけ抜き出したりといった処理は、データ分析や前処理において非常に役立ちます。

VBAでは難しいような大規模なファイル操作や文字コード対応も、C#であれば柔軟に対応可能です。
ぜひ参考にしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次