こんな要求に対する処理を書いていました。
- 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));
}
}
}
雲泥の差がありますねぇ…。
0 件のコメント:
コメントを投稿