FROM ME TO YOU

oh my bizarre life !!

TextFieldParserのサンプルを作ってみた

仕事でCSVやらTXTやらのテキストファイルを扱うことが多いのでTextFieldParserメソッドのサンプルを作ってみた。

固定長の場合、FieldWidthsプロパティの文字幅はバイト単位ではなく文字数単位らしい。 使えない…

[参照の追加] で Microsoft.VisualBasic.dll の追加を忘れずに。

データ

"11111","AAAA""AA"
"22222","BBBBBB "
#"22222","BBBBBB "

ソース

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using Microsoft.VisualBasic.FileIO;

namespace TextFieldParserTest
{
    class Program
    {
        static void Main(string[] args)
        {
            
            List<Data> CsvData = new List<Data>();
            string csvFileName = @"C:\tmp\test.csv";    // ファイル名

            Encoding Encode = Encoding.GetEncoding("Shift_JIS");    // Encode指定
            using (TextFieldParser Parser = new TextFieldParser(csvFileName, Encode))
            {
                Parser.TextFieldType = FieldType.Delimited;    // フィールド区切りタイプ
                Parser.Delimiters = new string[] { "," };      // 区切り文字
                Parser.HasFieldsEnclosedInQuotes = true;       // ダブルコーテーション区切り
                Parser.CommentTokens = new[] {"#"};            // レコード先頭のコメント文字
                Parser.TrimWhiteSpace = true;                  // フィールドの前後スペースを削除

                // データ読み込み
                while (!Parser.EndOfData)
                {
                    string[] fields = Parser.ReadFields();
                    Data data = new Data();
                    data.F1 = fields[0];
                    data.F2 = fields[1];
                    CsvData.Add(data);
                }

                // Console出力
                foreach (var n in CsvData)
                {
                    Console.WriteLine(n.F1+" "+n.F2);
                }
                Console.ReadKey();
            }

        }

        public class Data
        {
            public string F1 { get; set; }
            public string F2 { get; set; }
        }

    }
}

JIS丸め

JIS丸めについてうまく思い出せなかったのでメモ。

種類 四捨五入
一般的 0.5以上切り上げ
JIS丸め 0.5以外は同じ。0.5が四捨五入後が偶数になるように処理。

四捨五入後の値を合計する場合等、通常の四捨五入だと誤差が大きくなるため。 JIS丸めでも偶数や奇数の偏りがあった場合は誤差は発生する(通常の四捨五入より抑えられるが)

ExcelのRound関数は一般的な四捨五入で、ExcelVBAのRoundはJIS丸めなのは有名な話。

C#でも書いてみた。 一般的な四捨五入にするにはMidpointRounding.AwayFromZeroが必要らしい。

        static void Main(string[] args)
        {
            Console.WriteLine(Math.Round(2.5));
            // 2
            Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero));
            // 3
        }

氷菓の未収録短編を読みに滋賀県まで行ってきた

f:id:fmty_keita:20150613232631j:plain

僕の大好きな氷菓こと古典部シリーズには単行本未収録の短編が3つあります。

  • 連峰は晴れているか
  • 鏡には映らない
  • 長い休日

このうち、一番上の「連峰は晴れているか」はアニメで映像化されたのでいいとして、残りの2つがどうしても気になっていました。

単純に単行本未収録なだけであれば文庫化を気長に待つのですが、摩耶花が奉太郎を嫌っていた理由が明かになる「鏡には映らない」、奉太郎が"やらなければいけないことなら手短に"を言い出したきっかけとなる事件を扱った「長い休日」とくればもうコレは読むしかありません。

とはいえもう何年も前に出た小説雑誌なので当然書店では売っていませんし、Amazonマーケットプレイスで見ても数千円~数万円(!)とかなりのお値段。

文庫を待つしかないかなーと諦めてきたのですが、「そうだ!図書館があるじゃないか!」と紙のお告げがありまして。
最近は図書館の在庫をWebで検索できるんですよね。便利な世の中です。

今回探したのは古典部シリーズが掲載されている「野性時代」の2012年8月号(鏡には映らない)と2013年11月号(長い休日)の2冊です。

あんまり置いてない

まずそもそも野性時代のバックナンバーをそれなりに揃えている図書館が京都、滋賀、大阪、兵庫、奈良でも京都の城陽市立図書館、兵庫の加古川市立図書館、と今回行った賀県湖南市立図書館の3館しかなく、しかも僕の読みたい2冊を揃えていたのは湖南市立図書館だけでした。

加古川市立図書館は2013年1月分からしか置いてないのでNG。城陽私立図書館はかなり揃っているのに、僕が狙っている2012年8月号だけ紛失で貸出不可とか!(誰かパクった?)

湖南市なら高速で1時間ですし、十分行ける!ということで家族を連れて行ってきました。

f:id:fmty_keita:20150613234354j:plain

貸出は湖南市在住か通勤、通学している人のみということで、その場で読んできました。

図書館ってコピーできるのね

いやぁ面白かった。行った甲斐がありました。

主人公である奉太郎のあのモットーの背景にはあんな事件があったとは…
もうホント映像化してほしいです。

繰り返し読みたいので「どうしても貸してもらえませんか?」と司書の方に相談したところ、「短編ならコピーされてはいかがですか?」と一言。
もう速攻でコピーしちゃいました。

f:id:fmty_keita:20150613232633j:plain

「鏡には映らない」が30枚、「長い休日」が10枚なので合計40枚の400円。安い。図書館最高。

感想

まだ読み込んでいないので感想は書けません...
が、とにかくこの2本は氷菓好きなら必読です。

早く単行本化しないかなぁ。

LINQでSQLServerのデータ読み書きメモ

事前準備

  1. SSMSとかでテーブル作る
  2. Visualstudioで「Linq to SQLクラス」をプロジェクトに追加
  3. サーバーエクスプローラーでサーバーとテーブルを表示
  4. テーブルを2で作ったdbmlへドラッグ

コード

using (DataClasses1DataContext db = new DataClasses1DataContext())
{

    table1 d1 = new table1();

    d1.Text = "hogehoge";

    // データ追加
    db.Log.InsertOnSubmit(d1);
    db.SubmitChanges();
       
    var query = from n in db.table1
                where n.id > 2
                select n;

    foreach (var m in query)
    {
        Debug.WriteLine(m.id + ":" + m.Text);
    }
}

残課題

サーバやテーブル名をコード上で指定したい