「SJISのCSVファイルを各カラムの操作と条件による絞り込みを行い、UTF-8のCSVファイルを出力する処理をLINQで。」と同様に、TextReader/TextWriterをLINQで使いやすくする拡張メソッドを用意しておきます。
public static IEnumerable<string> GetLineEnumerator(this TextReader tr)
{
string s;
while ((s = tr.ReadLine()) != null)
{
yield return s;
}
}
public static void WriteLines(
this TextWriter tw, IEnumerable<string> values)
{
foreach (var line in values)
{
tw.WriteLine(line);
}
}
で、出力時に行番号を付ける方法を考えます。LINQっぽく考えれば、行番号は1から順番の数字が必要となるので、Enumerable.Rangeが使えそう。そして、行番号と入力した各ラインをそれぞれ順次送り出せればよいので、Enumerable.Zipで纏めるのがよさそう。
ってことで、前述の2つの拡張メソッドも使い、こんなコードになりました。
static void Main(string[] args)
{
using(var reader = new StreamReader(args[0]))
{
Console.Out.WriteLines(Enumerable.Range(1, int.MaxValue)
.Zip(reader.GetLineEnumerator(), Tuple.Create)
.Select(x => string.Format("{0}:{1}", x.Item1, x.Item2)));
}
}
0 件のコメント:
コメントを投稿