目次
経緯
業務で扱うことが多い .tsvファイル
(タブ区切り形式のテキストファイル)を、C#を使ってプログラム的に加工したいと考えました。
特に今回は、
- 351行目以降を5行ごとに間引き
- 347〜350行目を先頭に追加
- 特定の列だけを抽出
- 加工後のデータを新たなファイルとして出力
というフローを自動化するために、具体的な実装方法を学びました。
処理の全体像
今回の処理手順は以下の通りです。
.tsv
ファイルを読み込む- 351行目以降を5行おきに抽出
- 347~350行目を先頭に追加
- 加工後のデータを
output.tsv
として出力 - 指定された列のみを抽出して整形
- 整形済みデータを
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.tsv
:output.tsv
の中から指定された列のみを抽出して整形したファイル
どちらも Shift-JIS形式 で、デスクトップに保存されます。
今後の展望
この処理の次のステップとしては、.xlsx
ファイルへの自動変換や、整形済みデータの可視化などを検討しています。
必要に応じて、ClosedXML
などのライブラリを用いてExcel出力へ対応させることも可能です。
まとめ
今回は、.tsv
ファイルをC#で効率的に加工・整形し、業務で扱いやすい形に再出力する方法をご紹介しました。
特定の行だけ間引いたり、特定の列だけ抜き出したりといった処理は、データ分析や前処理において非常に役立ちます。
VBAでは難しいような大規模なファイル操作や文字コード対応も、C#であれば柔軟に対応可能です。
ぜひ参考にしてみてください。