こんな要求に対する処理を書いていました。
- Shift-JISのCSVファイルを入力し、UTF-8のCSVファイルを出力する。
- 入力したCSVの各カラムは、固定長で前後に空白が入る可能性があり、その空白は除去して出力する。
- 各行の先頭のカラムはIDになっていて、特定のIDのみ出力対象とする。
inFileが入力ファイルのパス、outFileが出力ファイルのパスとして、絞り込みの条件を「先頭カラムが奇数」とすると、以下のコードで拡張メソッドとか作らなくても要求が満たせてしまいますね。
File.WriteAllLines( outFile, File.ReadLines(inFile, Encoding.GetEncoding("shift-jis")) .Select(line => line.Split(',')) .Where(items => int.Parse(items[0]) % 2 != 0) .Select(items => string.Join(",", items.Select(item => item.Trim()))));
- inFileからShift-JISで各行を読み込み、
- ',' で分割し、
- 先頭カラムが奇数の行について、
- 各カラムの前後の空白を除去した上で再度 ',' で結合し、
- outFileに書き込む。
という処理になります。日本語とほぼ一対一にコードが対応してます。ちなみに、.net 2.0相当でコードを書くとこんな感じ。
var sb = new StringBuilder(); string line; using (var sr = new StreamReader(inFile, Encoding.GetEncoding("shift-jis"))) using (var sw = new StreamWriter(outFile)) { while ((line = sr.ReadLine()) != null) { var items = line.Split(','); sb.Length = 0; if (int.Parse(items[0]) % 2 != 0) { foreach (var item in items) { sb.Append(item.Trim()).Append(','); } sw.WriteLine(sb.ToString(0, sb.Length - 1)); } } }
雲泥の差がありますねぇ…。