2014/01/03

[プログラミング]ファイル読み込み

,
 100 Little Programming Exercises – go-left Softwareの"A.5 Count Words and Lines"です。と言ってもファイルの文字数と行数を数えるだけですが… 改行コードの猥雑さ(LF、CR、CRLF)を叩き込む、文字列処理の練習ということなんでしょうか?でも面倒だったので、Fileクラス使って済ませました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace CountWordsandLines1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Specify a file name");
            }
            else
            {
                var filename = args[0];
                var encoding = Encoding.UTF8;
                // ファイルを読みこむ
                //if(File.Exists(filename)) //ファイルが存在するかは、File.Exists()か読み込み時例外のどっち?
                try
                {
                    var lines = File.ReadLines(filename, encoding);
                    Console.WriteLine("File name : {0} contains {1} words in {2} lines", 
                        filename, lines.Select(line => line.Length).Sum(), lines.Count());
                }
                catch (FileNotFoundException e)
                {
                    Console.WriteLine(e.StackTrace + "\n" + e.Message);
                }
                catch (System.Security.SecurityException e)
                {
                    Console.WriteLine(e.StackTrace + "\n" + e.Message);
                }
            }
        }
    }
}

 File.ReadLines(string, Encoding)はどうやら.NET 4.0追加の新しい関数らしいです。私は最初ストリームを使うものだと思ってました。で、この関数は面白いことに、返り値がIEnumerable<string>です。

.NET Framework 4 の基本クラス ライブラリの新機能 - http://msdn.microsoft.com/ja-jp/magazine/ee428166.aspx

 なので今回はこれを使って、LINQ拡張メソッドで文字数を数えてます。.Select(line => line.Length)で行ごとの文字数を数え、それを.Sum()で合計してます。
 行数は、1行毎にIEnumerable<string>に突っ込まれているので、この要素数になります。
 一応幾つかファイルを読み込んでみた結果では、合ってるみたいです。

ぎもん

  • ファイルを読み込むときに、やはりファイルが存在するかは確かめると思うんだけど、これはFile.Exists()を使って事前に確かめるべきなのか?File.ReadLines()してみてFileNotFoundExceptionをcatchすることで把握するべきなのか?
  • Encodingの問題 - 未知のファイルは多分事前にエンコーディングはわからないだろうけど、どうするんだろう。
  • 容量の大きすぎるファイル問題 - GB級ファイルの問題とか、メモリをどうするかとか

0 コメント to “[プログラミング]ファイル読み込み”

コメントを投稿