【Excel】CSVファイルを開くその2

  • 改行ありのテキストファイルを読み取り
    ツールバーの「データ」-「外部データの取り込み」-「テキストファイル」から読み取る方法では、
    項目内に改行があるとずれたり、
    行数が多いと最後まで読み取れないことがある。

    そこで、セル全体を文字列に設定しておき、
    1セルを選択し、適当な文字列を入力する。
    次にそのセルを選択し、ツールバーの「データ」-「区切り位置」を選択する。
    「カンマやタブなどの区切り文字によってフィールドごとに区切られたデータ」を選択する。
    区切り文字に「カンマ」を選択する。
    列のデータ形式に「文字列」を選択する。

    最後にテキストファイルをCTRL+Aで全選択後にコピーし、
    先ほどのセルに貼りつけると、項目内に改行があってもずれずに
    行数が多くても貼りつけることができる。

【C#】WebBrowser読み込み完了後にCookieを取得しWebClientに引き渡す

WindowsForm上にWebBrowserを表示し、
読み込んだサイトのCookieをWebBrowserからWebClientに引き渡して処理を行います。

# Form1.cs
namespace WindowsFormsApplication1
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webBrowser1.Navigate("http://test1/");
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // クッキーを取得する。
            string cookieStr = webBrowser1.Document.Cookie;

            // WebClientを生成する。
            WebClient wc = new WebClient();
            Encoding enc = Encoding.UTF8;

            // WebClientのヘッダ設定を行う。
            // wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)");
            wc.Headers[HttpRequestHeader.Cookie] = cookieStr;

            // WebClientでクッキーを引き継いで他のサイトにアクセスする。
            byte[] result = wc.DownloadData("http://test2/");
            string html = enc.GetString(result);
            Console.WriteLine(html);

            // クッキーの中身を確認する。
            // string[] cookieAry = cookieStr.Split(';');
            // foreach (string str in cookieAry)
            // {
            //    MessageBox.Show(str);
            // }
        }
    }
}

【VisualStudio】オブジェクトにイベント追加

WindowsForm上にあるオブジェクトにイベントを追加します。
ボタンであればデザイナ上でボタンをダブルクリックすれば
イベント追加の設定が自動で行われますが、他のオブジェクトの場合の追加方法です。

オブジェクトをアクティブにしたら右下のプロパティの稲妻マークをクリックします。
ここに表示されているものが定義できるイベントの一覧で
白いテキストボックスをクリックするとイベント追加の設定が自動で行われます。

例として、WindowsForm上に「WebBrowser」を配置し、
WebBrowserでページ読み込み完了後を検知して処理を行いたい場合、
オブジェクトをアクティブにしたら右下のプロパティの稲妻マークをクリックし、
「DocumentCompleted」を選択すると、
イベント追加の設定が自動で行われ、「webBrowser1_DocumentCompleted」が生成されます。

# Form1.Designer.cs
namespace WindowsFormsApplication1
    partial class Form1
    {
        private void InitializeComponent()
        {
            this.webBrowser1.Location = new System.Drawing.Point(52, 193);
            this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
            this.webBrowser1.Name = "webBrowser1"
            this.webBrowser1.Size = new System.Drawing.Size(508, 213);
            this.webBrowser1.TabIndex = 2;
            this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);
        }
    }
}
# Form1.cs
namespace WindowsFormsApplication1
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // ここにページ読み込み完了後の処理を記載する。
        }
    }
}

【JScript】ディレクトリ内の全てのファイルを開き特定文字を置換する(行単位)

対象ディレクトリ内のファイルを行単位で読込み、置換を行います。
今回はテキストエリアの中身をCSVに出力したファイルの末尾が改行になっているものを
強制的に除去しているだけで、実際は置換していません。

対象の大量ファイルは「C:/replaceBefore」にあるとし、
置換後の大量ファイルを作成するために「C:/replaceAfter」を作成しておきます。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var files = fso.GetFolder("D:/replaceBefore").Files;
var e = new Enumerator(files);
// ディレクトリ内の全てのファイル分繰り返す。
for ( ; !e.atEnd(); e.moveNext()) {
    var file = e.item();
    var fileFullPathBefore = "D:/replaceBefore/" + file.Name;
    var fileFullPathAfter  = "D:/replaceAfter/" + file.Name;
    WScript.Echo(fileFullPathBefore + "を処理します。");

    // 入力ファイルの設定
    // Typeの設定値
    // 1:バイナリを表す。
    // 2:既定値。charsetで指定した文字セットで文字列を表す。
    var sr = new ActiveXObject("ADODB.Stream");
    sr.Type = 2;
    sr.charset = "utf-8";
    sr.Open();
    sr.LoadFromFile(fileFullPathBefore);

    // 出力ファイルの設定
    var sw = new ActiveXObject("ADODB.Stream");
    sw.Type = 2;
    sw.charset = "utf-8";
    sw.Open();

    // 入力ファイルの読込み
    // 入力ファイルがEOSになるまで繰り返す。
    while (!sr.EOS) {

        // ReadTextの第1引数
        // -1:既定値。EOSマーカーに達するまですべてのバイトをストリームから読み取る。
        // -2:改行までの行をストリームから読み取る。改行はLineSeparatorの設定値依存。
        var temp = sr.ReadText(-2);

        // 置換文字列検索用
        // RegExpの第2引数に'g'を指定すると全置換になる。
//        var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}");
//        var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}", 'g');
//        temp = temp.replace(reg, "");

        // 出力ファイルの書込み
        // WriteTextの第2引数
        // ActiveXObjectのTypeが文字列(2)の場合に利用する。
        // 0:既定値。文字列を書き込む。
        // 1:文字列+改行を書き込む
        // 末尾の1文字を取得する。
        var lastWord = temp.slice(-1);
        // 末尾がダブルクォートである場合
        if (lastWord == "\"") {
//            WScript.Echo("ダブルクォート");
            // 文字列+改行を書き込む。
            sw.WriteText(temp, 1);
        // 末尾がダブルクォート以外である場合
        } else {
//            WScript.Echo("違う");
            // 文字列を書き込む。
            sw.WriteText(temp, 0);
        }
    }

    // 書き込みの文字コードがUTF-8の場合、BOMが付与されるため、除去する。
    // 書き込んだオブジェクトのポジションをゼロに戻し、
    // バイナリモードを指定した上で、ポジションを3byte分ずらし、再書き込みする。
    // この処理順序は変更不可。
    if (sw.charset == "utf-8") {
        sw.Position = 0;
        sw.Type = 1;
        sw.Position = 3;
        var textBinary = sw.Read();
        sw.Close();
        sw.Type = 1;
        sw.Open();
        sw.Write(textBinary);
    }

    sr.Close();
    sr = null;

    // 出力ファイルの保存
    // SaveToFileの第2引数
    // 1:既定値。ファイルがない場合、新規作成する。ファイルがある場合、上書きしない。
    // 2:ファイルがない場合、新規作成する。ファイルがある場合、上書きする。
    sw.SaveToFile(fileFullPathAfter, 2);
    sw.Close();
    sw = null;
}
fso = null;

【FireFox】【Poster】リクエスト送信テスト

FireFoxのPosterと呼ばれるアドオンを利用し、
リクエスト送信のテストをしてみました。

  • サーブレット
    サーブレットはTestParamプロジェクトとして定義しておきます。
    TestServletはTestというサーブレットマッピング名として定義しておきます。

    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            // リクエストの設定
            request.setCharacterEncoding("UTF-8");
    
            // ヘッダ部の取得
            StringBuffer head = new StringBuffer();
            Enumeration<String> headernames = request.getHeaderNames();
            while (headernames.hasMoreElements()) {
                String name = headernames.nextElement();
                Enumeration<String> headervals = request.getHeaders(name);
                while (headervals.hasMoreElements()) {
                    String val = headervals.nextElement();
                    head.append(name);
                    head.append(":");
                    head.append(val);
                    head.append("\n");
            }
    
            // ボディー部の取得
            // メモ:Tomcatではrequest.getParameterとgetReaderが同時に使えない。
            BufferedReader bufferReaderBody = new BufferedReader(request.getReader());
            String body = bufferReaderBody.readLine();
    
            // レスポンスの設定
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/hmtl");
            // response.setContentType("application/json");
    
            // ヘッダ部とボディー部の出力
            PrintWriter out = response.getWriter();
            out.println(head.toString());
            out.println(body);
        }
    }
    
  • Poster
    Request-URL:http://localhost:8080/TestJson/Test
    Parametersタブ:Nameにtest、Valueにあいうえおを設定し、
    Add/Changeボタンを押下する。
    Content to Sendタブ:Body from Parametersボタンを押下する。
    POSTボタンを押下する。

    サーブレットがJSONの読み取りに対応していれば、
    ParametersタブのValueに以下を指定すると、JSONをリクエストで飛ばしたことになる。
    {“name”: “John Smith”, “age”: 33}

【JSP】ボタンでリンクと同じ動作を行う

ボタン押下時にリンク押下時と同じ動作を行う。

<input type="button" value="メニュー画面へ" onclick="location.href='Menu.jsp'" class="btn btn-default">

class属性はbootstrapの指定方法のひとつ。
ボタンを無地のデフォルトにします。

【JSP】ボタンやリンクからフォームのアクションを動的に変更しSubmit

ボタンやリンク押下時に
フォームのaction先をJavaScriptで設定し、submitする。

  • ボタンの場合

    <head>
    <script type="text/javascript">
    function exec(){
    	document.form1.value = 'ACTION001'
    	document.form1.submit();
    }
    </script>
    </head>
    
    <form action="" method="POST" name="form1">
    <input type="button" value="ボタン1" onClick="exec()" />
    </form>
    
  • リンクの場合

    <head>
    <script type="text/javascript">
    function exec(){
    	document.form1.value = 'ACTION001'
    	document.form1.submit();
    }
    </script>
    </head>
    
    <form action="" method="POST" name="form1">
    <a href="javascript:void(0)"  onClick="exec()">リンク1</a>
    </form>
    

    hrefに「javascript:void(0)」を指定しないと、
    ルート(http://localhost:8080/コンテキスト)にアクセスする。

【Eclipse】動的Webプロジェクトでのプロパティファイル読込

動的Webプロジェクトのプロパティファイル読込で
以下のように処理を書いてみました。

prop.load(new FileInputStream("hoge.properties"));

プロパティファイルをプロジェクト直下、クラスパス直下、パッケージ直下においてみましたが、
いずれも実行時にエラーになりました。
解決策として以下の通りにしました。

プロパティファイルは「WEB-INF/src」直下に配置し、
「WEB-INF/class」に自動コピーされるので、
以下のように処理を変更しました。

prop.load(this.getClass().getResourceAsStream("/hoge.properties"));

【Eclipse】classpathに書き込めませんでしたというエラーの原因

新規でプロジェクトを作成せず、
インポートしたプロジェクトに対して、外部JARファイルを追加した場合、
以下のようなエラーが出ることがあります。

ビルド・パスの設定(.classpathに書き込めませんでした)

原因は「.classpath」ファイルが隠しファイルになっているから。
「.classpath」ファイルを右クリックし、隠しファイルのチェックを外せば
エラーが解消します。