目次
経緯
.tsvファイルのデータを加工したいと思い、
今回勉強しました。
手順
まず、プログラムの流れを説明します。
- .tsvファイルを読む
- 351行目から開始して5つずつ間引く
- 347行目から350行目までの行を先頭に追加
- output.tsvとして出力する
- 指定した列のみで新しい行を作成
- 新しい行をsorted_output.tsvとして出力する
という流れです。下がコードです。
// .tsvファイルを開く
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();
}
// Skip processing 間引き
int n = 5;
List<string> reducedLines = new List<string>();
for (int i = 350; i < originalLines.Count; i += n)
{
reducedLines.Add(originalLines[i]);
}
// 347行目から350行目を先頭に追加
reducedLines.InsertRange(0, originalLines.GetRange(347, 3));
//出力
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string outputFile = Path.Combine(desktopPath, "output.tsv");
// Shift-JISエンコーディングを使用
System.Text.Encoding encoding = System.Text.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("終わりました。");
所々で.tsvファイルを出力して、中身を確認しています。
この後の処理は加工したデータを.xlsxファイルにするとか考えています。
何かの参考になれば、幸いです。
ここまで読んでいただきありがとうございました。