2019年8月10日土曜日

canvas テスト


Canvas


2019年8月8日木曜日

EXCELをODBC経由でSQLを使って操作する

Excelの編集をODBCを使って、
SQLを編集する用のメモ。

素直に、COMを使えという感じもあるけど、
SQLでExcelを操作できると嬉しい時もあるので...

1.Excel用のODBCドライバの入手

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント

Access何とかとなってるけど、Excelのドライバも
ついてくるみたいなので、ダウンロードしてインストール

2.ODBCドライバ名の確認

コントロールパネルを開いて、odbcを検索


ODBCデータソースから、Excel用のドライバが
インストールされていることを確認



3.空のExcelの作成

自分の使った範囲では、元ネタのExcelを作成は
odbc経由では作れないので、Excelを使用して
空のExcelを作成する。

4.コマンドラインツールの作成

SQL入力用のコマンラインツールを作成する。
下記のリストをコピーして、
Visual Studio か、コマンドラインでコンパイルする。

Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.Odbc
Imports System.Text.RegularExpressions
    
Public Class DBAccessor2
    Dim  conn As OdbcConnection
    Dim  Command As OdbcCommand
    Dim  adapter As OdbcDataAdapter
    Dim transaction As OdbcTransaction

    Public Function Open(ByVal driver As string,ByVal dbq As String,ByVal uid As String,ByVal pwd As String) As Boolean
        Dim builder As OdbcConnectionStringBuilder = new OdbcConnectionStringBuilder()
        builder.Driver = driver ';   //ドライバー名
        builder.Add("DBQ", dbq) ';   //リスナー名
        builder.Add("UID", uid) ';   //ユーザ名
        builder.Add("PWD", pwd) ';   //パスワード
        builder.Add("ReadOnly","False") '
        conn = new OdbcConnection(builder.ConnectionString)
        conn.Open()
        command = new OdbcCommand()
        command.Connection = conn
        adapter = new OdbcDataAdapter()
        return true
    End Function

    Public Sub Close() 
        If(conn IsNot Nothing)
            conn.Close()
            conn = Nothing
            command = Nothing
            adapter = Nothing

        End If
    End Sub
    
    Public Function GetData(ByRef sql As String) As DataSet
        Dim dSet As DataSet = New DataSet()
        command = conn.CreateCommand()
        command.Transaction = transaction
        command.CommandText = sql
        adapter.SelectCommand = Command
        adapter.Fill(dSet)
        Return dSet
    End Function

    Public Sub Execute(ByRef sql As String) 
        Command = conn.CreateCommand()
        command.Transaction = transaction
        command.CommandText = sql
        command.ExecuteNonQuery()
    End Sub
    
End Class

Public Module SqlCmd
            
    Sub Main(ByVal args() As String)

        Dim sql,line As String
        Dim dba As New DBAccessor2

        Line = ""
        dba.Open("Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)",args(0),"none","none")
        While(True)
            Try
                sql = ""
                While (True)
                    System.Console.Write(">>")
                    line = System.Console.In.ReadLine()
                    System.Threading.Thread.Sleep(10)
                    If line = "e" Or Line = "go"
                        Exit While
                    Else
                        Line = Regex.Replace(Line,"\/\*.*?\*\/","") 'コメント部分を削除
                        'System.Console.WriteLine(Line)
                        sql += " " + Line + ControlChars.NewLine
                    End If
                    
                End While
                    
                If Line = "e" Then
                    Exit While
                End If
                Dim t As DataTable
                'dba.Execute(sql)
                Dim tables As DataTableCollection
                Dim cList As New List(Of String)
                tables = dba.GetData(sql).Tables
                If(tables.Count >= 1)
                   t = tables(0)
                   For Each c As DataColumn In t.Columns
                       System.Console.Write(c.ColumnName + ControlChars.Tab)
                       cList.Add(c.ColumnName)
                   Next
                   System.Console.WriteLine()

                   For Each row As DataRow In t.Rows
                       For Each Str As String In cList
                           System.Console.Write(row(Str).ToString + ControlChars.Tab)
                       Next
                       System.Console.WriteLine()
                   Next
                End If
            Catch ex As Exception
                System.Console.WriteLine(ex.ToString())
            End Try
        End While

        dba.Close()
        
    End Sub

 End Module

5.SQLでExcelを操作

作成したExcelには、Sheet1とSheet2が
あるものとしてCmdプロンプトで実行



6.SQL実行した後のExcel







2019年7月20日土曜日

.net とXPathで遊ぶ

xml ファイルを読み込んで、
指定したXpathで取得したノードの
内部の情報を表示するだけのツール作ってみた。


using System.Xml;
using System.Xml.XPath;

public class TestXPath{
    public static void Main(string[] args){
        if(args.Length < 2){
            System.Console.WriteLine("usage: XPath hoge.xml /xpath");
        }
        else{

            XmlDocument doc = new XmlDocument();

            //XMLファイルのローディング
            doc.Load(args[0]);

            XPathNavigator navi;
            navi = doc.CreateNavigator();

            //XmlNodeList nodes = doc.SelectNodes(args[1]);
            //foreach(XmlNode node in nodes){
            //    System.Console.WriteLine(node.InnerXml);
            //}

            //XPath
            XPathNodeIterator xpIt = navi.Select(args[1]);
            while(xpIt.MoveNext()){
                System.Console.WriteLine(xpIt.Current.InnerXml);
            }
        }
    }
}
    

emacs 26.2のnxml

emacs でxmlを編集する時、
nxml-modeを昔から愛用してたのだけど、
emacsのどこかのヴァージョンで標準で搭載
されるようになったみたい。

で、標準になったのは、いいのだけど、
このモードで一番使用していた
補完機能のキーバインドが変わってしまっていた。

途方にくれて、調べていたら、
ここに書いてあった。

 C-M-i or <ESC> <TAB> or M-x completion-at-point

らしい。

上の方法を使ってもよいのだけど、
今までの補完方法 C-returnにするため、

下記を.emacsに追加

(defun my-nxml-mode-init()
  (local-set-key (kbd "<C-return>") 'completion-at-point)
  )


(add-hook 'nxml-mode-hook 'my-nxml-mode-init)


すっきりした。