読者です 読者をやめる 読者になる 読者になる

管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

特定の列名を持つテーブルを検索する(Oracle)(SQLServer)

あるユーザのテーブルの中で、特定の列名を持つテーブルを検索したい時の方法。

Oracleの場合。USER_TAB_COLUMNSを参照。
ALL_TAB_COLUMNS

SELECT
    TABLE_NAME
    ,COLUMN_NAME
FROM
    USER_TAB_COLUMNS
WHERE
    COLUMN_NAME='DEPTNO'
ORDER BY
    TABLE_NAME
    ,COLUMN_NAME
;

実行結果。SCOTTスキーマの場合。

TABLE_NAME COLUMN_NAME
DEPT DEPTNO
EMP DEPTNO

SQLServerの場合。INFORMATION_SCHEMAを参照。

続きを読む

お台場ガンダムの今と、ポケモンGO(?)と

お台場ガンダムが展示終了したというのを聞いていましたが、その後どうなっているのか気になったため、見に行ってみました。
av.watch.impress.co.jp
本日のお供はGM1+20mm

周辺には柵が設けられており、近づけないようになっていましたが、ガンダム自体はそのままの様で。
f:id:ksk1130:20170312205618j:plain

続きを読む

pythonで1こ飛ばしのfor文てどうやるの...(python)

pythonで、1から10まで、みたいな繰り返しをどうやるかわからなかったので記録する。
下の時、迷ったのだ...
k-hitorigoto.hatenablog.jp
4. その他の制御フローツール — Python 2.7.13 ドキュメント

#!/usr/bin/python
# -*- coding:utf8 -*-

# range([始めの数,]繰り返しの数[,増分]
# 始めの数を指定しないと、0からスタート
# 増分を指定しないと、1ずつ増える
# range(0,10,1)と、range(10)は同じで、0から9まで1ずつ増える(計10回の繰り返し)
# range(1,10,2)は、1から9まで、2個飛ばし
# ↑だと、10回繰り返しではないけど。0スタート、1増の時の繰り返し数、になるのかな...

# 0 1 2 3 4 5 6 7 8 9
for i in range(10):
    print i
    
for i in range(0,10,1):
    print i

# 1 3 5 7 9
for i in range(1,10,2):
    print i

可視シート名を列挙する(ExcelVBA)

Excelで、アクティブブックの可視シート名を列挙する方法。結構使うけど忘れがちなのでメモ。

Option Explicit

Sub 可視シート名を列挙する()

    Dim sheetCnt As Integer
    Dim i As Integer
    Dim tmpSheet As Worksheet

    sheetCnt = ActiveWorkbook.Worksheets.Count

    For i = 1 To sheetCnt
        Set tmpSheet = ActiveWorkbook.Worksheets(i)
   
        If tmpSheet.Visible = True Then
            Debug.Print tmpSheet.Name
        End If
   
        Set tmpSheet = Nothing
    Next

End Sub

対象となるブックと、実行結果は以下の通り。可視シートのみシート名が出力されます。
f:id:ksk1130:20170309233739p:plainf:id:ksk1130:20170309233740p:plain

PythonでSeleniumを使ってWebページ内のテーブルの内容を取得する

Webページを取得して操作する方法に、Seleniumというのがあるのを最近知りました。
Selenium - Web Browser Automation
テーブルが使われたWebページから内容を取得したかったので、その方法を調べました。
Seleniumはいろんな言語からアクセスすることが出来るようですが、今回はPythonを使ってみました。

対象となるページは以下のような感じ。

<html>
<head></head>
<body>
    <table class="table_desu">
        <tr>
            <th>No</th><th>品目</th><th>価格</th>
        </tr>
        <tr>
            <td>1</td><td>りんご</td><td>150</td>
        </tr>
        <tr>
            <td>2</td><td>みかん</td><td>120</td>
        </tr>
        <tr>
            <td>3</td><td>ぶどう</td><td>200</td>
        </tr>
    </table>
</body>
</html>

こちらは、Python+Seleniumで上記Webページにアクセスし、テーブルの内容を先頭行をのぞいて取得し、標準出力に表示する例です。
テーブル内容を取得する方法がJavascriptみたいで親近感わきましたが、実はもっとスマートなやり方があるのかしら...

#!/usr/bin/python
# -*- coding: utf-8 -*-

import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from pyvirtualdisplay import Display

BASE_URL = "http://hoge.fuga/"

try:
    display = Display(visible=0, size=(800, 600))
    display.start()

    driver = webdriver.Firefox()
    driver.implicitly_wait(30)

    # Webページへアクセス
    driver.get(BASE_URL)
    driver.implicitly_wait(15)
    
    # テーブル内容取得
    tableElem = driver.find_element_by_class_name("table_desu")
    trs = tableElem.find_elements(By.TAG_NAME, "tr")
    
    # ヘッダ行は除いて取得
    for i in range(1,len(trs)):
        tds = trs[i].find_elements(By.TAG_NAME, "td")
        line = ""
        for j in range(0,len(tds)):
            if j < len(tds)-1:
                line += "%s\t" % (tds[j].text)
            else:
                line += "%s" % (tds[j].text)
        print line+"\r\n"
except:
    print traceback.format_exc()
finally:

    if driver is not None:
        driver.quit()

    if display is not None:
        display.stop()

実行結果は以下の通り

1       りんご  150
2       みかん  120
3       ぶどう  200

CSVファイルの重複を除いて結合する(shellscript)

昨日のPowershellのshellコマンドバージョン
k-hitorigoto.hatenablog.jp
昨日に引き続き、対象のデータは以下のような感じです。

a.csv
日付,品目,価格
2017/3/3,りんご,150
2017/3/3,みかん,130
2017/3/4,キウイ,200

b.csv
日付,品目,価格
2017/3/3,みかん,130
2017/3/4,キウイ,200
2017/3/4,バナナ,200
2017/3/4,ぶどう,400

c.csv
日付,品目,価格
2017/3/4,ぶどう,400
2017/3/5,りんご,150
2017/3/5,キウイ,200
head -1 `ls *.csv | head -1` && tail -q -n +2 *.csv | sort | uniq

'&&'より左側は、ヘッダ行を切り出すための処理、'&&'の右側は、ヘッダ行を除いてソートして、マージする処理です。
Powershellはヘッダ周りをうまいことやってくれたけど、こちらはそうもいかないので、力業でやってみました。

CSVファイルの内容の重複を除いて結合する(Powershell)

Powershellを使って、CSVファイルの内容の重複を除いて、結合したくなったのでメモ。
対象のファイルは以下のような、一部内容に重複のあるファイル。

a.csv
日付,品目,価格
2017/3/3,りんご,150
2017/3/3,みかん,130
2017/3/4,キウイ,200

b.csv
日付,品目,価格
2017/3/3,みかん,130
2017/3/4,キウイ,200
2017/3/4,バナナ,200
2017/3/4,ぶどう,400

c.csv
日付,品目,価格
2017/3/4,ぶどう,400
2017/3/5,りんご,150
2017/3/5,キウイ,200

内容の重複を除いて、結合するには以下のようにすると良し。

Get-ChildItem *.csv | ForEach-Object{Import-Csv $_} | Sort-Object -Property 日付,品目,価格 -Unique

結合結果は以下のようになります。Export-CSVCSVファイルとして出力できます。

日付     品目   価格
----     ----   ----
2017/3/3 みかん 130
2017/3/3 りんご 150
2017/3/4 キウイ 200
2017/3/4 バナナ 200
2017/3/4 ぶどう 400
2017/3/5 キウイ 200
2017/3/5 りんご 150