2016年6月6日月曜日

Linqを少し使ってみた

プログラミングの効率を上げるには、LINQは なかなか便利な機能だ。

レシートのスキャンデータから、Money用のOFXデータを作成するようなソフトを
作ってみようかと考えている。LINQを少し使ってみた。

○例えば、指定フォルダのファイルをcomboboxに取り込む ためには
 public static IEnumerable<string> SearchDir(string dirPath, string str)
        {
            // 指定フォルダーのファイル列挙
            DirectoryInfo di = new DirectoryInfo(dirPath);
            IEnumerable<System.IO.FileInfo> fiList = di.GetFiles("*.pdf", SearchOption.TopDirectoryOnly);

            return
                fiList
                .Where(fi =>   
                       (0 <= fi.Name.IndexOf(str, StringComparison.CurrentCultureIgnoreCase)))
                .Select(fi => fi.FullName); // フルパスに変換
        }

private void comboBox1_DropDown_1(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            foreach (string path in SearchDir(textBox2.Text, ".pdf"))
            {

                comboBox1.Items.Add(path);
            }
        }

○ 複数ページのPDFのレシートからテキストを抽出し、そのテキストデータをページデータに分割する処理は

 textBox1.Text = File.ReadAllText(System.IO.Path.GetDirectoryName(filename)+"\\"+ System.IO.Path.GetFileNameWithoutExtension(filename)+".txt", System.Text.Encoding.GetEncoding("shift_jis"));

            string txtall = textBox1.Text;
            string[] delimiter = { "---------------------------------- Page" };
            receipt = txtall.Split(delimiter , StringSplitOptions.None);

             shpName=receipt.Select(rc => shop_c(rc)).ToArray();
            string[] idx = receipt.Select(rc => rc.Substring(0, 5)).ToArray();            

            comboBox2.Items.AddRange(idx);

  private string shop_c(string txt)
        {
            string[] shopd = listBox1.Items.Cast<string>().ToArray();//あらかじめ登録してある店名のデータがレシートの中にあれば、店名を出力
            string sst="";
            foreach (string st in shopd)
            {
                if (txt.IndexOf(st) >= 0)
                {
                    sst= st;
                   
                }
            }
            return sst;
        }

0 件のコメント:

コメントを投稿